2013 Warm up 3 -- Skill --- dp

 

题意:求n位数字,满足非递减的个数。

dp[ i ] [ j ] = sum( dp[i -1] [ k ] );  k =>( j , 9);

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cstdlib>
 5 using namespace std;
 6 int dp[100002][11]={0};
 7 int mod=1000000007;
 8 void prepare()
 9 {
10     int i,j,s;
11     for(i=0;i<=9;i++)
12     {
13         dp[2][i]=10-i;
14         dp[2][10]+=dp[2][i];
15     }
16     for(i=3;i<=100000;i++)
17     {
18         for(j=0;j<=9;j++)
19         {
20             if(j==0)
21             {
22                 dp[i][j]=dp[i-1][10];
23             }
24             else for(s=j;s<=9;s++)
25             {
26                 dp[i][j]=(dp[i][j]+dp[i-1][s])%mod;
27             }
28             dp[i][10]=(dp[i][10]+dp[i][j])%mod;
29         }
30     }
31 }
32 void cs()
33 {
34     int i;
35     for(i=0;i<=10;i++)
36         printf("%d ",dp[3][i]);
37     printf("\n");
38 }
39 int main()
40 {
41     int T,n;
42     prepare();
43     scanf("%d",&T);
44     while(T--)
45     {
46         scanf("%d",&n);
47         if(n==1)
48         {
49             printf("10\n");
50             continue;
51         }
52         printf("%d\n",dp[n][10]);
53     }
54     return 0;
55 }

 

posted @ 2013-11-19 17:47  芷水  阅读(165)  评论(0编辑  收藏  举报