• 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比较相等时取它对角的前一个,就被一个点卡住了。很坑啊。。。

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


  • 相关阅读:
    java基础练习 4
    java基础练习 5
    java基础练习 3
    java基础练习 2
    二级联动菜单动态刷新下拉列表的一种实现方法
    疯狂Java讲义笔记(二)
    Windows10 Internet Explorer已停止工作的解决方法
    Git笔记
    Spring Boot笔记
    maven笔记
  • 原文地址:https://www.cnblogs.com/java20130723/p/3212152.html
Copyright © 2020-2023  润新知