动态规划复习-HDU2084

水题一道,但是论坛中有人说从上往下dp,一定是wa,我两个方向都试过了,全部ac。 自底向上dp:
#include 
int c, n;
int dp[100][100];
int max (int a, int b) {
	if (a > b)
		return a;
	return b;
}
int main() {
	scanf("%d", &c);
	while (c--) {
		scanf("%d", &n);
		for (int i = 1; i <= n; ++i)
			for (int j = 1; j <= i; ++j)
				scanf("%d", &dp[i][j]);
		for (int i = n - 1; i > 0; --i)
			for (int j = 1; j <= i; ++j)
				dp[i][j] = max(dp[i + 1][j], dp[i + 1][j + 1]) + dp[i][j];
		printf("%d\n", dp[1][1]);
	}
	return 0;
}
自顶向下dp:
#include 
#include 
int c, n;
int dp[100][100];
int max (int a, int b) {
	if (a > b)
		return a;
	return b;
}
int main() {
	scanf("%d", &c);
	while (c--) {
		scanf("%d", &n);
		memset(dp, 0, sizeof(dp));
		for (int i = 1; i <= n; ++i)
			for (int j = 1; j <= i; ++j)
				scanf("%d", &dp[i][j]);
		for (int i = 1; i <= n; ++i)
			for (int j = 1; j <= i; ++j)
					dp[i][j] = max(dp[i - 1][j - 1], dp[i - 1][j]) + dp[i][j];
		int m = 0;
		for (int i = 1; i <= n; ++i)
			if (dp[n][i] > m) m = dp[n][i];
		printf("%d\n", m);
	}
	return 0;
}


  注意不要和“自顶向下分析,自底向上求解”混淆了。

posted on 2012-02-08 23:40  sing1ee  阅读(133)  评论(0)    收藏  举报