NYOJ 269 VF

来源:互联网 发布:人工智能如何实现 编辑:程序博客网 时间:2024/05/20 23:06

题意:输入一个数s,求1-10^9中,每个数的各位数字之和为s的数有几个

dp[i][j]表示前 j 位数字之和为 i 的情况的数量

当 i 〉1 时,假设第 j 位为 k ,那么前 j - 1 的和就是 i - k;

由此得出状态转移方程dp[i][j]=dp[i][j]+dp[i-k][j-1];

#include<cstring>#include<cstdio>#include<iostream>#include<cmath>#include<algorithm>#include<queue>#include<vector>using namespace std;#define mod 1000000007#define PI acos(-1.0)#define INF 0x3f3f3f3ftypedef long long LL;int a[85][15];void init(){    for(int i=0;i<10;i++)        a[0][i]=1;//前面全部为0的个数为1    for(int i=1;i<=81;i++){        for(int j=1;j<10;j++){            for(int k=0;k<10&&i-k>=0;k++){//第j为为k,前j-1位为i-k                if(a[i-k][j-1])                    a[i][j]+=a[i-k][j-1];            }        }    }}int main(){    int n;    init();    while(cin>>n){        if(n==1)cout<<10<<endl;//因为算的是九位的,少算1e9        else        cout<<a[n][9]<<endl;    }    return 0;}
0 0