1. 程式人生 > >51 Nod 1043 幸運號碼(需重做好好體會)

51 Nod 1043 幸運號碼(需重做好好體會)

一道非常好的dp題目。

基準時間限制: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;
}