很水,我却做了很久,唉,细节的东西没处理好。。。
又要顺序又要最大的,看上去感觉就和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比较相等时取它对角的前一个,就被一个点卡住了。很坑啊。。。
额,以后做题要细心了。。