码迷,mamicode.com
首页 > 其他好文 > 详细

幸运数字(数位dp)

时间:2017-10-14 18:36:47      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:text   ack   ret   结果   main   size   span   clu   ace   

个人心得:数位dp处理起来是真的麻烦,本来动态规划就够头疼的了,菜的一批。

来看这个题目吧,题目在下面。

把题目变成可以求得就是求前n个数中1-n*9的情况的总和,所以用dp【i】【j】,表示前i个数中和为j的个数。

状态转移方程就是

dp[i][j]=dp[i-1][j-k]  0=<k<=9;

但是后面要注意前导为0的情况所以总和ans=(dp[i][j]-dp[i-1][j])*dp[i][j](后面N段不需要考虑前导为0的情况,前面前导为0的情况就是前n-1位中和为j的值)

脑瓜子还是不行呀!!!数位dp看了基本绕路走。。。。

1个长度为2N的数,如果左边N个数的和 = 右边N个数的和,那么就是一个幸运号码。
例如:99、1230、123312是幸运号码。
给出一个N,求长度为2N的幸运号码的数量。由于数量很大,输出数量 Mod 10^9 + 7的结果即可。
Input
输入N(1<= N <= 1000)
Output
输出幸运号码的数量 Mod 10^9 + 7
Input示例
1
Output示例
9
 1 #include<iostream>
 2 #include<cstring>
 3 #include<string>
 4 #include<cstdio>
 5 #include<vector>
 6 #include<cmath>
 7 #include<stack>
 8 #include<set>
 9 #include<queue>
10 #include<algorithm>
11 using namespace std;
12 const long long mod=1000000007;
13 long long  dp[1005][9999];
14 int main()
15 {
16 
17     memset(dp,0,sizeof(dp));
18     dp[0][0]=1;
19     int i,n;
20     cin>>n;
21     for(i=0;i<10;i++)
22         dp[1][i]=1;
23     for(i=2;i<=n;i++)
24     for(int j=0;j<=9*i;j++){
25         for(int k=0;k<=9;k++)
26             {
27                 if(j>=k)
28                 dp[i][j]=(dp[i][j]+dp[i-1][j-k])%mod;
29             }
30     }
31     long long ans=0;
32     for(i=0;i<=n*9;i++)
33          ans=(ans+dp[n][i]*(dp[n][i]-dp[n-1][i]))%mod;
34     cout<<ans<<endl;
35     return 0;
36 }

 



幸运数字(数位dp)

标签:text   ack   ret   结果   main   size   span   clu   ace   

原文地址:http://www.cnblogs.com/blvt/p/7667688.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!