本文主要是介绍Ural 1353 Milliard Vasya's Function(DP),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
题目地址:Ural 1353
定义dp[i][j],表示当前位数为i位时,各位数和为j的个数。
对于第i位数来说,总可以看成在前i-1位后面加上一个0~9,所以状态转移方程就很容易出来了:
dp[i][j]=dp[i][j]+dp[i][j-1]+dp[i][j-2]+.......+dp[i][j-9];
最后统计即可。
代码如下:
#include <iostream>
#include <cstdio>
#include <string>
#include <cstring>
#include <stdlib.h>
#include <math.h>
#include <ctype.h>
#include <queue>
#include <map>
#include <set>
#include <algorithm>using namespace std;
const int INF=0x3f3f3f3f;
#define LL long long
int dp[10][90];
int main()
{int n, i, j, sum, s, k;memset(dp,0,sizeof(dp));for(i=1;i<=9;i++)dp[1][i]=1;for(i=2;i<=9;i++){s=0;for(j=1;j<=81;j++){for(k=0;k<j&&k<=9;k++){dp[i][j]+=dp[i-1][j-k];}}}while(scanf("%d",&n)!=EOF){if(n==1){puts("10");continue ;}sum=0;for(i=1;i<=9;i++){sum+=dp[i][n];}printf("%d\n",sum);}return 0;
}
这篇关于Ural 1353 Milliard Vasya's Function(DP)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!