1. 程式人生 > >[51nod1043]幸運號碼

[51nod1043]幸運號碼

就是 號碼 con bbb ace 結果 log name 動態規劃

題意:1個長度為2N的數,如果左邊N個數的和 = 右邊N個數的和,那麽就是一個幸運號碼。

例如:99、1230、123312是幸運號碼。 給出一個N,求長度為2N的幸運號碼的數量。由於數量很大,輸出數量 Mod 10^9 + 7的結果即可。 解題關鍵: 動態規劃,dp[i][j]表示i個數和為j的總數(這裏包括開頭為0的情況) $dp[i][j] = \sum\limits_{k = 0}^9 {dp[i - 1][j - k]} $
最後,我們只需要用去掉0打頭的情況*沒有去掉0打頭的情況累加並取模即可。
這裏去掉0的方法是$dp[n][i] - dp[n - 1][i]$ 這裏可以進行滾動數組優化。
#include<bits/stdc++.h>
using
namespace std; typedef long long ll; const int mod=1e9+7; ll dp[1002][9002]; int main(){ int n; cin>>n; dp[0][0]=1; for(int i=1;i<=n;i++){ for(int j=0;j<=9*i;j++){ for(int k=0;k<=9&&k<=j;k++){ dp[i][j]+=dp[i-1][j-k]; dp[i][j]
%=mod; } } } ll ans=0; for(int i=0;i<=9*n;i++){ ans+=dp[n][i]*(dp[n][i]-dp[n-1][i]); ans%=mod; } cout<<ans<<"\n"; return 0; }

[51nod1043]幸運號碼