hdoj3664【DP】

题意:
有一种值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;
}
posted @ 2016-09-08 19:00  see_you_later  阅读(87)  评论(0编辑  收藏  举报