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 }