标签: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看了基本绕路走。。。。
输入N(1<= N <= 1000)
输出幸运号码的数量 Mod 10^9 + 7
1
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 }
标签:text ack ret 结果 main size span clu ace
原文地址:http://www.cnblogs.com/blvt/p/7667688.html