| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2619 人关注过本帖
标题:高中竞赛题,求算法、思路
只看楼主 加入收藏
天胖
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2008-10-8
收藏
得分:0 
非常感谢各位的回答!
动态规划不来,只有用贪心了,
方法与7楼同。
2008-10-12 18:29
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
dp[l][r] = min{dp[l][m-2]+dp[m+2][r]}+w

m为l和r间的任意值,取m-1,m,m+1三列中最高物品的高度作为消耗w.

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2008-10-13 12:08
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
照着孔明的思想自己写了个,没优化……还是觉得贪心比较简单……

程序代码:
#include <stdio.h>
#include <string.h>

#define N 100

int d[N];
int dp[N][N] = {{0}};

int max(int l, int r)
{
    int m = l++;
    for (; l <= r; l++)
        if (d[m] < d[l]) m = l;
    return d[m];
}

int proc(int l, int r)
{
    int i, m = 0, cur;
    if (l > r) return 0;
    if (dp[l][r]) return dp[l][r];
    if (r - l < 3)
        return dp[l][r] = max(l , r);

    cur = 0x7FFFFFFF;
    for (i = l + 1; i <= r - 1; i++)
    {
        int ndp = proc(l, i - 2) + proc(i + 2, r);
        if (ndp < cur) cur = ndp, m = i;
    }
    return dp[l][r] = cur + max(m - 2, m + 2);
}

int main()
{
    int r, c, n;
    while (scanf("%d %d %d", &r, &c, &n) == 3)
    {
        memset(d, 0, sizeof(d));
        memset(dp, 0, sizeof(dp));
        while (n--)
        {
            int x, y;
            scanf("%d %d", &y, &x);
            if (d[x-1] < y) d[x-1] = y;
        }
        printf("%d\n", proc(0, c - 1));
    }
    return 0;
}


专心编程………
飞燕算法初级群:3996098
我的Blog
2008-10-13 18:18
安静的小羊
Rank: 1
来 自:广东
等 级:新手上路
帖 子:34
专家分:0
注 册:2008-6-4
收藏
得分:0 
7楼的算法不能得到全局最优解。

假设X[] = {0,3,2,0,4,1,0}

用7楼的算法得出的结果是4+3+1=8

但最优解是3+4=7

[[it] 本帖最后由 安静的小羊 于 2008-10-13 20:32 编辑 [/it]]

我无所事事所度过的今天,是昨天死去的人们所奢望的明天 ...
2008-10-13 19:57
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
LS的数据,我在一开始举给出的贪心法,是可以得到最优解的。LS能不能再找找反例呢?

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-10-13 20:06
安静的小羊
Rank: 1
来 自:广东
等 级:新手上路
帖 子:34
专家分:0
注 册:2008-6-4
收藏
得分:0 
你的算法也不能得出最优解吧。同样用我上面的数据,这里X[]里的数字既表示这一列物品的个数,也表示最高物品的高度。

我无所事事所度过的今天,是昨天死去的人们所奢望的明天 ...
2008-10-13 20:39
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
怎么不能呢?我的策略是先找到最高的那个元素,然后尝试他周围三个列,这里是0,4,1三个列,当然4,1都可以,然后是第二高的列。0,3,2,这里3和2都可以,那么这样的话,爬的总高度就是4+3=7了啊,的确是最优解嘛……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-10-13 21:07
安静的小羊
Rank: 1
来 自:广东
等 级:新手上路
帖 子:34
专家分:0
注 册:2008-6-4
收藏
得分:0 
按照你的算法应该是先取2跟4之间的那个0点,因为这里能拿到6个,1、4两个点只能拿到5个

我无所事事所度过的今天,是昨天死去的人们所奢望的明天 ...
2008-10-13 21:36
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
哦,我明白了,谢谢指正。
看来贪心法的确会有点问题的……
还是孔明的DP比较强啊,哈哈~~~

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-10-13 22:53
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
还有,孔明
dp[l][r] = min{dp[l][m-2] + dp[m+2][r] + w}可以不?我试验了这个公式,貌似也是正确的……虽然效率比你的要低一些……感觉这个公式的DP是可以退化到一般的贪心法的……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-10-13 22:55
快速回复:高中竞赛题,求算法、思路
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019288 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved