Fork me on GitHub

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 }

  

 

 

 

posted @ 2019-08-05 08:47  yelir  阅读(162)  评论(0编辑  收藏  举报