URAL1353——DP——Milliard Vasya's Function
大意:问你从1到10^9之内所有位数相加为S的数有多少
我们定义dp[i][j]表示一共i位的数的和为j,那么可以得到状态转移方程dp[i][j] = dp[i-1][j] + dp[i-1][j-1] + ...dp[i-1][j-9]当然满足j-9 >= 0 因为考虑的是当前状态与原来状态的改变,把状态看做是一个整体,要插入的只是一个元素,dp[i-1][j]表示往入0,其他的意思就是插入k,考虑当s = 1时,要加1
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[10][85]; int main() { int S; memset(dp,0,sizeof(dp)); for(int i = 1; i <= 9; i++) dp[1][i] = 1; for(int i = 2; i <= 9 ;i++){ for(int j = 1; j <= 81; j++) { dp[i][j] = dp[i-1][j]; for(int k = 1; k <= 9 && k <= j ;k++){ dp[i][j] += dp[i-1][j-k]; } } } while(~scanf("%d",&S)){ int ans = 0; if(S == 1) {printf("10\n"); continue;} for(int i = 1; i <= 9;i++) ans += dp[i][S]; printf("%d\n",ans); } return 0; }