1043 幸运号码

基准时间限制:1 秒 空间限制:131072 KB 分值: 20
难度:3级算法题
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 数位dp。下面是看别人的代码A的,我怕是与dp无缘了/(ㄒoㄒ)/。。。 Code:#include <bits/stdc++.h> #define LL long long using namespace std; const int AX = 1e3+6; const int MOD = 1e9+7; LL n , dp[9005] , ans , f[9005]; //dp[i][j],表示第i位数总和为j的号码的个数,每个dp[i][j]都是dp[i-1][j-v](0<=v<=9) 的总和,所以拆成一维的两个,左边n, //右边也是n int main(){ cin >> n; f[0] =1 ; //左边一半的第一位不能为0 for( int i =1 ; i <= 9 ; i++ ){ dp[i] = 1; f[i] = 1; } for( int i = 2 ; i <= n ;i ++){ for( int j = 9*n ; j >= 1 ;j --){ LL dpos = 0 , fpos = 0; for( int k = 0 ; k <= 9 ; k++ ){ if( j - k >= 0 ){ fpos = (fpos+f[j-k]) % MOD; dpos = (dp[j-k]+dpos) % MOD; }else break; } f[j] = fpos; dp[j] =dpos; } } for( int i = 1 ; i <= 9*n ; i++ ){ ans = (ans+(dp[i]*f[i])%MOD)%MOD; //左右和相等的排列组合总的数量 } cout << ans << endl; return 0; }