您的位置:首页 > 其它

UVa 10198 - Counting

2015-10-26 10:57 162 查看
題目:給你一個數字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
[end] && end) -- end;
		printf("%d",dp
[end --]);
		while (end >= 0)
			printf("%04d",dp
[end --]);
		puts("");
	}
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: