51Nod 1043 幸運號碼 數字DP

2021-08-09 08:50:18 字數 1221 閱讀 6943

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的方案數

一位數 ***t 可以看做是在乙個三位數後面新增乙個數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 2 #include 3

4 typedef long

long

ll;5

const

int mod=1e9+7;6

const

int maxn=1010;7

8int

n,m;910

ll ans;

1112 ll dp[2][maxn*10

];13

14int

hh() 24}

25for(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);

28return0;

29}3031

int sb=hh();

32int main(int argc,char**argv)

**

51nod 1043 幸運號碼 (數字dp)

dp i j 表示 i 個數和為 j 的總數 包含0開頭情況 dp i j dp i 1 j k i 1 這裡用滾動陣列節省記憶體 非0開頭的情況 0開頭的情況 dp n 1 i dp n 1 1 i dp n 1 i 最後將其累加即為結果。開始沒有想到這麼做,還傻傻的dfs,用dp 1000 10...

51 nod 1043 幸運號碼 數字DP

1043 幸運號碼 基準時間限制 1 秒 空間限制 131072 kb 分值 20 難度 3級演算法題 1個長度為2n的數,如果左邊n個數的和 右邊n個數的和,那麼就是乙個幸運號碼。例如 99 1230 123312是幸運號碼。給出乙個n,求長度為2n的幸運號碼的數量。由於數量很大,輸出數量 mod...

51nod 1043 幸運號碼(數字dp)

51nod 1043 幸運號碼 數字dp 用dp i j 表示長度為 i,和為 j 的所有情況 包含前導零 狀態轉移方程 dp i j d p i 1 j k 0 k 9 dp i j sum 0 k 9 dp i j dp i 1 j k 0 k 9 最後結果根據乘法法則 應該是左邊的情況 右邊的...