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