题目描述:
中国古代的历史故事“田忌赛马”是为大家所熟知的。话说齐王和田忌又要赛马了,他们各派出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] ) };