刚开始用的动态规划+贪心

知道转移方程,但不知如何实现

下面为别人的思想:

f [i,j] 表示齐王按从强到弱的顺序出马和田忌进行了 i 场比赛之后,田忌从“头”取了 j 匹较强的马,从“尾”取了 i-j 匹较弱的马,所能够得到的最大盈利。

状态转移方程如下:

 f[i,j]=max{f[i-1,j]+g[n-(i-j)+1,i],f[i-1,j-1]+g[j,i]}

其中g[i,j]表示田忌的马和齐王的马分别按照由强到弱的顺序排序之后,田忌的第 i 匹马和齐王的第 j 匹马赛跑所能取得的盈利,胜为200,输为-200,平为0。

若读者知道怎样实现,请留言分享您的思路,谢谢

哎,又参考了别人的代码,贪心,太贪心了

代码有改动,感谢纠错

代码如下:

#include<stdio.h>
#include<stdlib.h>

int cmp(const void *a,const void *b)  //按速度由快到慢排序
{
    return *(int*)b-*(int*)a;
}

int main()
{
    int n,i;
    int t[1005],k[1005];
    while(scanf("%d",&n),n)
    {
        for(i=1; i<=n; i++)
            scanf("%d",&t[i]);
        for(i=1; i<=n; i++)
            scanf("%d",&k[i]);
        qsort(t+1, n, sizeof(t[0]), cmp) ;  //给田忌的马排序
        qsort(k+1, n, sizeof(k[0]), cmp) ;  //  国王
        int t_first, k_first, t_last, k_last;
        t_first = k_first = 1,t_last = k_last = n ;
        int flag = 1, ans = 0;
        while(flag)
        {
            if(t_first == t_last) flag = 0;  //最后一匹了
            if(t[t_first] > k[k_first])      //若当前田忌最快的马比国王最快的马快
            {
                t_first++;                   //让它俩比吧,田忌最快的马变成下一匹
                k_first++;
                ans += 200;
            }
            else if(t[t_last] > k[k_last])
            {
                t_last--;
                k_last--;
                ans += 200;
            }
            else                             //以上都不满足,下面注意了。。。
            {
                if(t[t_last] < k[k_first])   //若田最慢比国王最快的慢,比,此if只对ans -= 200有效
                    ans -= 200;
                t_last--;                    //上面的if若成立,执行这两句,不成立同样执行
                k_first++;                   //那就是田最慢与国王最快同速
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}
View Code

 

posted on 2014-05-01 16:57  Acmer_侯贺帅  阅读(180)  评论(0编辑  收藏  举报