NYOJ_269_VF

个人觉得DP最烦的就是确定初始边界,比如说这题,求10^9的数内各个数位相加的和中有多少个数的数位和等于S

初始条件:dp[0][j]=1   j=1、2…9

状态转移方程:

dp[i][j]表示:和为i,不超过j个数相加的符合条件的数有多少个

dp[i][j]=sum{dp[i-k][j-1]  k=0、1…9}

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
int main()
{
    int i,j,k,dp[89][30]={0},n;
 for(i=0;i<12;++i)
     dp[0][i]=1;
 for(i=1;i<82;++i)
     for(j=1;j<10;++j) //10^9,只需要算9位就好了
         for(k=0;k<10&&i-k>=0;++k) //k表示第j位为k
         {
             if(dp[i-k][j-1]) //如果前面的数位能组合成和i-k
             dp[i][j]+=dp[i-k][j-1];
         }
 while(~scanf("%d",&n))
 {
     if(n==1)  //特判一下
         printf("10\n");
     else printf("%d\n",dp[n][9]);
 }
 return 0;
}

 

posted @ 2013-05-04 12:04  小仪在努力~  阅读(280)  评论(1编辑  收藏  举报