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

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

一道非常好的dp题目。

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
#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;
}
原文地址:https://www.cnblogs.com/linruier/p/9747088.html