1. 程式人生 > >51Nod 1043 幸運號碼 數位DP

51Nod 1043 幸運號碼 數位DP

nod display 每次 png 方案 def -s ima plus

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
技術分享
李陶冶 (題目提供者) 關於計數的題目,數位DP 我們用 dp[i][j] 代表i位數的和為j的方案數 一位數 xxxt 可以看做是在一個三位數後面添加一個數t 明顯 dp[i][j] + = dp[i-1][j-t]; 轉移 就是dp[i][j]=Σdp[i-1][j-t] (j-t>=0) 統計ans要註意 每次我們都是在一個數後面加一個數t(t>=0&&t<=9) 所以我們可能出現 左邊數的第一位我們放了0的情況 左邊的一個數的第一位不可能為0 所以要減去第一位為0的情況 技術分享
 1 #include <cctype>
 2
#include <cstdio> 3 4 typedef long long LL; 5 const int mod=1e9+7; 6 const int MAXN=1010; 7 8 int n,m; 9 10 LL ans; 11 12 LL dp[2][MAXN*10]; 13 14 int hh() { 15 scanf("%d",&n); 16 dp[0][0]=1; 17 for(int i=1;i<=n;++i) 18 for(int j=0;j<=n*9;++j) {
19 dp[i&1][j]=0; 20 for(int t=0;t<=9;++t) { 21 if(j-t<0) continue; 22 dp[i&1][j]=(dp[i&1][j]+dp[(i-1)&1][j-t])%mod; 23 } 24 } 25 for(int i=0;i<=n*9;++i) 26 ans=(ans+dp[n&1][i]*(dp[n&1][i]-dp[(n-1)&1][i]))%mod; 27 printf("%lld\n",ans); 28 return 0; 29 } 30 31 int sb=hh(); 32 int main(int argc,char**argv) {;}
代碼

51Nod 1043 幸運號碼 數位DP