洛谷P2401 不等数列 题解

可食用的题目链接

题解:

有题目得:这个题有巧做法而不是暴力模拟。废话

这个题看着像一道dp,因为可以由前一种(数据更小的推出数据更大的)推出后一种。

我们设已经得到了n-1个数的总方法(1~n-1),然后根据这个我们要推出1~n的方法,

于是我们考虑把新加入的一个数n枚举其插入位置,

因为每插入一个数,它一定比前面的任何数都大(从小到大)

如果插入到最左边,会造成新的序列比原来多一个大于号,如果插入到最右边,会造成新的序列比原来多一个小于号。

(注意是这个数插入到符号的位置)

如果插入到大于号的位置,删去一个大于号,多一个大于号一个小于号,也就是多一个小于号如果插入到小于号的位置,删去一个小于号,多一个大于号一个小于号,也就是多一个大于号

所以,dp方程如下:(其中mod=2015)

dp[i][j]=(dp[i-1][j]*(j+1)+dp[i-1][j-1]*(i-j))%mod;

所以AC代码如下:

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define mod 2015
using namespace std;
int n,k;
int rqych[1002][1002];
int read()
{
    int ans=0;
    char ch=getchar(),last=' ';
    while(ch<'0'||ch>'9')last=ch,ch=getchar();
    while(ch>='0'&&ch<='9')ans=(ans<<3)+(ans<<1)+ch-'0',ch=getchar();
    return last=='-'?-ans:ans;
}
int main()
{
    int i,j;
    n=read(),k=read();
    for(i=1;i<=n;i++) rqych[i][0]=rqych[i][i-1]=1;
    for(i=2;i<=n;i++) 
        for(j=1;j<=min(i-1,k);j++) rqych[i][j]=(rqych[i-1][j]*(j+1)+rqych[i-1][j-1]*(i-j))%mod;
    printf("%d",rqych[n][k]);
    return 0;
}

完结

希望对大家有帮助

原文地址:https://www.cnblogs.com/lbssxz/p/11166510.html