田忌赛马

题目描述:

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

 

 

原文地址:https://www.cnblogs.com/vb4896/p/3975656.html