题目:click here
分析:dp[i][j] 表示i位数字,当前数字和为j的个数。dp[i][j] = dp[i-1][j] + dp[i-1][j-k] 前面表示在i-1位数后面加零,后面表示在前一位前面加k这个数。(注意k的取值范围)。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 int s; 5 int dp[11][83]; 6 int cnt[83]; 7 void pre() { 8 memset( dp, 0, sizeof(dp) ); 9 memset( cnt, 0, sizeof(cnt) ); 10 for( int j=1; j<=9; j++ ) dp[1][j] = 1; 11 for( int i=2; i<10; i++ ) 12 for( int j=1; j<82; j++ ) 13 for( int k=j; k>0&&j-k<10; k-- ) 14 dp[i][j] += dp[i-1][k]; 15 cnt[1] = 10; 16 for( int i=2; i<82; i++ ) 17 for( int j=1; j<10; j++ ) 18 cnt[i] += dp[j][i]; 19 20 } 21 22 int main() { 23 pre(); 24 while( ~scanf("%d", &s ) ) { 25 printf("%d\n", cnt[s] ); 26 } 27 return 0; 28 }
URAL 1353 Milliard Vasya's Function DP
时间: 2024-11-29 09:05:34