rqnoj 496 [IOI1999]花店橱窗布置 (简单dp)

很水,我却做了很久,唉,细节的东西没处理好。。。

又要顺序又要最大的,看上去感觉就和LCS一样,很容易想出状态转移公式:dp[i,j] = max{dp[i - 1][j - 1] + a[i][j], dp[i - 1][j]}.

AC代码如下:

#include <cstdio>
const int maxn = 100 + 10;
const int min = -1000000;
int a[maxn][maxn] = {0};
int dp[maxn][maxn];
bool path[maxn][maxn] = {0};

void pt(int i, int j){		//find path
	if (i == 0)
		return;
	if (path[i][j] == 1)
	{
		pt(i - 1, j - 1);
		printf("%d ", j);
	}
	else
		pt(i, j - 1);
	return;
}

int main()
{
	int f, v;
	int i, j;
	scanf("%d%d", &f, &v);
	for (i = 1; i <= f; i++)
		for (j = 1; j <= v; j++)
			scanf("%d", &a[i][j]);
	for (i = 1; i <= f; i++)
		for (j = 0; j <= v; j++)
			dp[i][j] = min;		//ini
	for (i = 1; i <= f; i++)
		for (j = i; j <= v && i <= i + f; j++)
			if (dp[i - 1][j - 1] + a[i][j] <= dp[i][j - 1])
				dp[i][j] = dp[i][j - 1];
			else
				dp[i][j] = dp[i - 1][j - 1] + a[i][j], path[i][j] = 1;
	printf("%d\n", dp[f][v]);
	pt(f, v);
	return 0;
}


恩。。。复杂度o(n^2),还好,因为数据小,寻址用递归做。

wa了几次,由于如下原因:

1.没有把dp初始化成极小,导致前面的花瓶没有被插到花

2.本来想仅初始化必要的数值,减小不必要的开销,但老是被一点卡住。

3.题目说输出任何一种方案即可,但是我设定如果dp比较相等时取它对角的前一个,就被一个点卡住了。很坑啊。。。

额,以后做题要细心了。。


原文地址:https://www.cnblogs.com/java20130723/p/3212152.html