51nod 1043 幸运号码(数位dp)

题目链接:51nod 1043 幸运号码

题解:dp[i][j]表示 i 个数和为 j 的总数(包含0开头情况)

dp[i][j] = dp[i-1][j-k]

i & 1 :这里用滚动数组节省内存

非0开头的情况 * 0开头的情况:(dp[n&1][i]-dp[(n-1)&1][i]) *dp[n&1][i],最后将其累加即为结果。

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #define CLR(a,b) memset((a),(b),sizeof((a)))
 5 using namespace std;
 6 
 7 const int inf = 0x3f3f3f3f;
 8 const int mod = 1e9 + 7;
 9 const int N = 1001;
10 int n;
11 long long dp[2][9*N];//i个数和为j的数量
12 int main(){
13     int i, j, k;
14     long long sum, ans;
15     scanf("%d", &n);
16     CLR(dp, 0);
17     for(i = 0; i <= 9; ++i)
18         dp[1][i] = 1;
19     for(i = 2; i <= n; ++i){
20         for(j = 0; j <= 9*i; ++j){
21             sum = 0;
22             for(k = 0; k <= 9; ++k){
23                 if(j >= k)
24                     sum = (sum + dp[(i-1)&1][j-k]) % mod;
25             }
26             dp[i&1][j] = sum;
27         }
28 
29     }
30     ans = 0;
31     for(i = 1; i <= 9*n; ++i){
32         ans = (ans + (dp[n&1][i]-dp[(n-1)&1][i]) *dp[n&1][i]) %mod;
33     }
34     printf("%d\n", ans);
35     return 0;
36 }
View Code

 

posted @ 2016-10-01 19:07  GraceSkyer  阅读(530)  评论(0编辑  收藏  举报

~~~~~~ACM大牛语录,激励一下~~~~~~

为了世界的和平,为了女生的安全,我拼命做题,做题,做题!

用最短的时间,刷最多的题!

给我一滴泪,我就看到了你全部的海洋!

seize the hour, seize the day.

人生难免有无奈,幸福走远了,或是感叹幸福来迟了.其实我一直相信,无论手中的幸福是多么微不足道的感觉,我会把握住那每一分,每一秒,当幸福依旧像那百鸟般飞逝,终究无法掌握时,我会感谢它,曾经降临过!

A自己的题,让别人郁闷去吧

WA肠中过,AC心中留 TLE耳边过,AC特别牛

天然的悲苦和伤逝,过去有过,以后还会有

^*^一步一步往上爬^*^

AC就像练级,比赛就像PK. 练级不如PK好玩

其实,世上本没有ACM,AC的人多了,也便有了!

AC无止尽~ Seek you forever~

找呀找呀找水题,找到一个AC一个呀!

AC是检验程序的唯一标准。

真的猛士,敢于直面惨淡的人生,敢于正视淋漓的鲜血……