转自:http://www.cnblogs.com/geloutingyu/p/6329594.html

一道非常好的dp题目。

1043 幸运号码 51 Nod 1043 幸运号码(需重做好好体会)-LMLPHP

基准时间限制: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
#include <bits/stdc++.h>
#define ll long long
using namespace std; const int mod=1e9+7;
const int MAXN=1010;
ll dp[MAXN][MAXN*9]; int main(void){
ll ans=0;
int n;
cin >> n;
dp[0][0]=1;
for(int i=1; i<=n; i++){
for(int j=0; j<=i*9; j++){
for(int k=0; k<=9; k++){
if(j>=k){
dp[i][j]=(dp[i][j]+dp[i-1][j-k])%mod;
}else{
break;
}
}
}
}
for(int i=0; i<=9*n; i++){
ans=(ans+(dp[n][i]-dp[n-1][i])*dp[n][i])%mod;
}
cout << ans << endl;
return 0;
}
05-11 22:00