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

2021-08-07 16:43:27 字數 734 閱讀 1247

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]記錄,今天心情不好,超級不好,做著做著放棄了。

#includeusing namespace std;

typedef long long ll;

#define pb push_back

const int mod=1e9+7;

const int inf = 0x3f3f3f3f;

const int n = 1001;

int n;

long long dp[2][9*n];//i個數和為j的數量

int main(){

scanf("%d",&n);

memset(dp,0,sizeof(dp));

int sum;

for(int i = 0; i <= 9; ++i)

dp[1][i] = 1;

for(int i=2;i<=n;i++)

for(int j=0;j<=9*i;j++)

{sum=0;

for(int k=0;k<=9;k++)

{if(j

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

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 最後結果根據乘法法則 應該是左邊的情況 右邊的...