51NOD 1043 幸運號碼

2021-07-16 20:53:15 字數 1181 閱讀 9419

基準時間限制: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示例

9dp水過

d[i][j]表示長度為i且和為j的數的個數(003這種0開頭的也算)

d[i][j]=d[i-1][j]+d[i-1][j-1]+d[i-1][j-2]+……..+d[i-1][j-9];

分別表示:

長度為i-1且和為j的數後面添乙個0

長度為i-1且和為j-1的數後面添乙個1

…… 長度為i-1且和為j-9的數後面添乙個9

所以 長度為2*i,前i個數和=後i個數和=j 的方案數為(d[i][j]-長度為i以0開頭且和為j的數個數)*d[i][j]

顯然d[i-1][j] 可以看作是長度為i 第乙個數為0 和為j的情況

所以 =(d[i][j]-d[i-1][j])*d[i][j]

每次只用到d[i],d[i-1]所以迴圈陣列即可

#include

#include

using namespace std;

#define ll long long

#define inf 1000000007

#define sci(a) scanf("%d",&a)

#define pri(a) printf("%d\n",a);

#define n 1005

int d[2][9*n],*d1,*d2;

int dp(int n)

swap(d1,d2);

}int res=0;

for(int i=1;i<=9*n;++i)

res=(res+(ll)d1[i]*(d1[i]-d2[i]))%inf;

return res;

}int main()

AC日記 幸運號碼 51nod 1043

幸運號碼 思路 傳說中的數字dp 不難發現,n n 1000 那麼,n個數的最大和為9 1000 9000 對於9000 1000的時間範圍,我們可以用dp來解決 dp i j 表示第i為數總和為j的號碼的個數 每個dp i j 都是dp i 1 j v 0 v 9 的總和 然後按照左邊的n和右邊的...

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