幸運號碼 數字dp,51nod 1043

2021-09-17 05:35:02 字數 1093 閱讀 7945

1 秒131,072 kb

20 分

3 級題

1個長度為2n的數,如果左邊n個數的和 = 右邊n個數的和,那麼就是乙個幸運號碼。

例如:99、1230、123312是幸運號碼。

給出乙個n,求長度為2n的幸運號碼的數量。由於數量很大,輸出數量 mod 10^9 + 7的結果即可。

收起

輸入n(1<= n <= 1000)
輸出幸運號碼的數量 mod 10^9 + 7
1
9
解析:

用dp[i][j]來儲存長度為i,數字和為j的情況個數(包括前導0)

dp[i][j]=dp[i-1][j]+dp[i-1][j-1]+dp[i][j-2]+...+dp[i][j-9]

dp[i][j]由dp[i-1][j]後面加0,dp[i-1][j-1]後面+1,.......,dp[i][j-9]後面加9形成

不包括前導0,長度為2i,前一半和為j,後一半和為j的個數:

dp[i][j]=(dp[i][j]-dp[i][j](以0開頭))*dp[i][j](後一半不用管前導0)

dp[i][j](以0開頭)就等於dp[i-1][j]再前面加乙個0

dp[i][j]=(dp[i][j]-dp[i-1][j])*dp[i][j];

注意n=1的情況,dp[0][0]=1;

ac:

#include #define mod 1000000007

#define maxn 1005

#define ll long long

using namespace std;

ll dp[maxn][maxn*9];

int main()

}ll ans = 0;

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;

}

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...

51Nod 1043 幸運號碼 數字DP

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

51 nod 1043 幸運號碼 數字DP

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