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

来源:互联网 发布:php购物车提交订单 编辑:程序博客网 时间:2024/05/01 15:37

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

又要顺序又要最大的,看上去感觉就和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 pathif (i == 0)return;if (path[i][j] == 1){pt(i - 1, j - 1);printf("%d ", j);}elsept(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;//inifor (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];elsedp[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比较相等时取它对角的前一个,就被一个点卡住了。很坑啊。。。

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