題目:給你一個數字n,求有多少種1,2,3,4構成的串位數之和為n,4按1計算。
分析:dp,動態規劃,大整數。找到遞推公式:f(n)= f(n-1)*2 + f(n-2)+ f(n-3)。
首先,設計狀態f(n),為和為n的數字串的種類數;
然後,考慮退化情況,只用1和2組成的數字串,和為n的情況;
這時,我們分兩種情況考慮以1結束和以2結束,因此得到地推關係:f(n)= f(n-1)+ f(n-2);
最後,推廣公式得到1,2,3,4的數字串公式為:f(n)= f(n-1)*2 + f(n-2)+ f(n-3)。
說明:利用數位壓縮,可以提高效率。
#include <cstring>
#include <cstdio>
int dp[1001][111];
int main()
{
memset(dp, 0, sizeof(dp));
dp[1][0] = 2;dp[2][0] = 5;dp[3][0] = 13;
for (int i = 4; i < 1001; ++ i) {
for (int j = 0; j < 110; ++ j)
dp[i][j] = dp[i-1][j]+dp[i-1][j]+dp[i-2][j]+dp[i-3][j];
for (int j = 0; j < 110; ++ j)
if (dp[i][j] > 9999) {
dp[i][j+1] += dp[i][j]/10000;
dp[i][j+0] %= 10000;
}
}
int n, end;
while (~scanf("%d",&n)) {
end = 110;
while (!dp[n][end] && end) -- end;
printf("%d",dp[n][end --]);
while (end >= 0)
printf("%04d",dp[n][end --]);
puts("");
}
return 0;
}