zoukankan      html  css  js  c++  java
  • 田忌赛马

    题目描述:

    中国古代的历史故事“田忌赛马”是为大家所熟知的。话说齐王和田忌又要赛马了,他们各派出N匹马,每场比赛,输的一方将要给赢的一方200两黄金,如果是平局的话,双方都不必拿出钱。现在每匹马的速度值是固定而且已知的,而齐王出马也不管田忌的出马顺序。请问田忌该如何安排自己的马去对抗齐王的马,才能赢取最多的钱? N<=1000

     

    解题过程:

    首先直觉是贪心,想到3个贪心策略:

     


    策略A:

    田忌每次用最烂的马去和齐王最屌的马pk。(尽可能消耗齐王的强马)

    反例是显然的,比如

    田忌:1 2  3 4 4 5

    齐王:3  4 4 4 6 7

    按照此策略 出场顺序是 (1,7)(2,6)(3,4)(4,4)(4,4)(5,3)3败2平1胜;

    而如果(1,7)(2,6)(3,4)(4,4)(4,3)(5,4)可以做到 3败1平2胜;

    因此策略A失败。 

     


    策略B:

    田忌每次都用最强的马去找齐王的马中最强的且能打的过的,和它pk。

    疑问:如果田忌有一匹马可以和齐王的一匹马打平手,也可以干掉齐王的另外一匹马,那么应该干掉那匹马,还是打平手呢?比如田忌有一匹马能力是 5,齐王剩余的马的能力分别是5,3,2,那么应该去打5还是打3呢?

    (个人感觉如果所有马的能力值都不相同的情况下,这个贪心策略是可以的。。)

     

    如果有相同的情况,可以得到下面的反例:

    田忌 : 5  8   9

    齐王 : 6  7   9

    如果能打平手就打平手,那么结果是1胜1平1败;

    而实际上可以(9,7)(8,6) (5,9),2胜1败;

     

    如果能打平手但不打:有下面的反例:

    田忌: 6 10 11 

    齐王: 7 11 12

    如果能打平手但不打,那么(11,7)(10,11) (6,12),1胜2败;

    而实际上可以(11,11)(10,7)(6,12) 1胜1平1败;

     

    因此策略B失败。 


    策略C:

    田忌每次用自己最弱的马,去齐王那里挑一匹能打赢的且能力最大的马打掉,如果都不能打,就和齐王最牛的马去打。

    (个人感觉如果所有马的能力值都不相同的情况下,这个贪心策略也是可以的。。)

    反例也是可以找到的。。


    dp正解:

    可以当做齐王是按从强到弱的顺序来出马的。把田忌的马从小到大排序存在数组A,齐王从大到小存在数组B。

    那么对于齐王的一匹马,田忌有两个选择,要么选自己最强的马和他打,要么选自己最弱的马和它打。

    所以 F[i][j](j<=i)表示前i次决斗,田忌出了j次最弱的马的最优解。

    那么F[i][j]=max{ F[i][j-1] + pk(A[j],B[i])  ,   F[i-1][j] + pk(A[n-(i-j)+1] , B[i] ) };

     

     

  • 相关阅读:
    邮箱的第99封邮件,第1个Offer
    学校的多媒体网站也模仿Google改版了
    惠普:计算机在非洲大有可为(zz)
    PPLive是不错的东东
    Google增加反病毒功能
    开复给中国学生的第五封信 – 你有选择的权利(zz)
    Yahoo中国变脸?
    拟停止本Blog更新
    在FC4上装GT4.0
    Google CodeJam 中国编程挑战赛拉开帷幕
  • 原文地址:https://www.cnblogs.com/vb4896/p/3975656.html
Copyright © 2011-2022 走看看