幸運號碼(51nod

2021-08-31 16:06:03 字數 1278 閱讀 3623

1個長度為2n的數,如果左邊n個數的和 = 右邊n個數的和,那麼就是乙個幸運號碼。例如:99、1230、123312是幸運號碼。給出乙個n,求長度為2n的幸運號碼的數量。由於數量很大,輸出數量 mod 10^9 + 7的結果即可。

題目解法:簡單dp

設出陣列dp【】【】,dp【i】【j】表示第i個數的和為j的個數

首先是最原始**:

#include #include #include #include #include #include typedef long long ll;

using namespace std;

const int maxn = 1005;

int table[maxn][maxn*9+100];//不帶0的dp

int dp[maxn][maxn*9+100];//帶0的dp

int n;

const int mod = 1e9 + 7;

int main()

dp[1][0] = 1;

for(int i=1;i<=1001;i++)}}

while(~scanf("%d",&n))

printf("%lld\n",sum);

}return 0;

}

這份**問題很大,其中記錄的陣列有兩個,顯然不能設定成long long,否則會超出空間限制,那麼就在計算的時候很小心,千萬不能計算越界。這裡說明個事情,這裡是單組資料測試,如果是多組資料測試,我這份**還是有優勢的。

單組測試的有效陣列就只有兩個,乙個帶零的乙個不帶的,就宣告兩個就夠了,進行其次不帶零的數可以推出,例如dp【i】【j】不帶零的結果就是dp【i】【j】帶零的-dp【i-1】【j】帶零的。

當然,下面的**就是借鑑的大佬的了,寫的非常不錯。

typedef long long ll;

using namespace std;

const int maxn = 1005;

int table[maxn][maxn*9+100];

int dp[maxn][maxn*9+100];

int n;

const int mod = 1e9 + 7;

int main()

dp[1][0] = 1;

for(int i=1;i<=1001;i++)}}

while(~scanf("%d",&n))

printf("%lld\n",sum);

}return 0;

}

51NOD 1043 幸運號碼

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

51Nod 幸運數字(打表)

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

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和右邊的...