hdoj3664【DP】

来源:互联网 发布:linux mint 18.2 编辑:程序博客网 时间:2024/05/18 02:29

题意:
有一种值E=the number of elements where ai > i.比如1 3 2 4,只有3位置是满足的,E=1。然后他会给你一个数组和一个k,问有多少个序列的E=k。
思路:
看到n和k都是1e3我觉得就应该想到n^2的复杂度上去,然后就是dp。不是说dp熟练,这就是一种解题思路的发现嘛,扯远了。。
dp[i][j]表示前i个数的排列中E值为j的个数。处理dp[i][j]就是对于第i个,加进去,①如果就是放在最后dp[i][j]+=dp[i-1][j] 不变。②如果放到的地方是a[k]>k的还是不变。③如果放到不是a[k]>k的,那么就是+1;
dp[i][j]+=dp[i-1][j]+dp[i-1][j]j+dp[i-1][j-1](i-j);
题外话:
感觉说起来还是有点难的,但是思路一旦明确,以及dp[i][j]的确立,状态转移,总体就偏简单了。自己在队里是挑DP的,要好好搞。。。
PS:这里要打表

#include <bits/stdc++.h>using namespace std;typedef long long LL;const int mod=1e9+7;const int N=1e3+10;LL dp[N][N];int main(){    LL n,k;    memset(dp,0,sizeof(dp));    for(int i=0;i<=1000;i++)        dp[i][0]=1;    for(LL i=1;i<=1000;i++)    {        for(LL j=1;j<=i;j++)            dp[i][j]=(dp[i-1][j-1]*(i-j)%mod+dp[i-1][j]*(j+1)%mod)%mod;    }    while(~scanf("%lld%lld",&n,&k))        printf("%lld\n",dp[n][k]);    return 0;}
0 0
原创粉丝点击