51 Nod 1043 幸運號碼(需重做好好體會)
阿新 • • 發佈:2018-12-13
一道非常好的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; }