DP-------bzoj2699 更新
题目描述:
对于一个数列A[1..N],一种寻找最大值的方法是:依次枚举A[2]到A[N],如果A[i]比当前的A[1]值要大,那么就令A[1]=A[i],最后A[1]为所求最大值。假设所有数都在范围[1, K]内,按上面的步骤执行,有多少个长度N的数列满足A[1]被更新的次数恰好为P呢?
输入格式:
本题有多组数据。输入第一行一个数T为数据组数,下面T行每行依次三个数N、K和P。
输出格式:
对每组数据输出一行,为方案数模1000000007的值。
输入:
3
4 3 2
2 3 1
3 4 1
输出:
6
3
30
代码:
1 #include<cstdio> 2 #include<iostream> 3 #include<cstdlib> 4 #define mod 1000000007 5 using namespace std; 6 long long sum[155][155][330]; 7 int main() 8 { 9 int i,j,k,T,x,y,z; 10 for( i=1;i<=300;i++)sum[1][1][i]=i; 11 for( i=2;i<=150;i++) 12 for( j=1;j<=150;j++) 13 for(k=1;k<=300;k++) 14 { 15 sum[i][j][k]=(sum[i][j][k-1]+sum[i-1][j-1][k-1]+(sum[i-1][j][k]-sum[i-1][j][k-1])*k % mod+mod)%mod; 16 } 17 scanf("%d",&T); 18 while(T--)scanf("%d%d%d",&x,&y,&z),printf("%lld\n",sum[x][z+1][y]); 19 return 0; 20 }