1. 程式人生 > >田忌賽馬-貪心正確性證明

田忌賽馬-貪心正確性證明

演算法可以用DP,或者給每匹馬連線賦權變為二分圖最佳匹配,還有就是貪心了。
1.當田忌最慢的馬比齊王最慢的馬快,贏一場先
2.當田忌最慢的馬比齊王最慢的馬慢,和齊王最快的馬比,輸一場
3.當田忌最快的馬比齊王最快的馬快時,贏一場先。
4.當田忌最快的馬比齊王最快的馬慢時,拿最慢的馬和齊王最快的馬比,輸一場。
5.當田忌最快的馬和齊王最快的馬相等時,拿最慢的馬來和齊王最快的馬比.

田忌賽馬貪心的正確性證明。

先說簡單狀況下的證明:
1.當田忌最慢的馬比齊王最慢的馬快,贏一場先。因為始終要贏齊王最慢的馬,不如用最沒用的馬來贏它。
2.當田忌最慢的馬比齊王最慢的馬慢,和齊王最快的馬比,輸一場。因為田忌最慢的馬始終要輸的,不如用它來消耗齊王最有用的馬。
3.當田忌最慢的和齊王最慢的馬慢相等時,分4和5討論。
4.當田忌最快的馬比齊王最快的馬快時,贏一場先。因為最快的馬的用途就是來贏別人快的馬,別人慢的馬什麼馬都能贏。
5.當田忌最快的馬比齊王最快的馬慢時,拿最慢的馬和齊王最快的馬比,輸一場,因為反正要輸一場,不如拿最沒用的馬輸。
6.當田忌最快的馬和齊王最快的馬相等時,這就要展開討論了,貪心方法是,拿最慢的馬來和齊王最快的馬比.
前面的證明像公理樣的,大家一看都能認同的,沒有異議的,就不細說了。


證明:田忌最快的馬和齊王最快的馬相等時拿最慢的馬來和齊王最快的馬比有最優解。

1)假設他們有n匹馬,看n=2的時候.

a1 a2
b1 b2

因為 田忌最快的馬和齊王最快的馬相等 所以a1=b1,a2=b2 所以這種情況有2種比賽方式,易得這兩種方式得分相等。

2)當數列a和數列b全部相等等時(a1=b1,a2=b2...an=bn),顯然最慢的馬來和齊王最快的馬比有最優解,可以贏n-1長,輸1場,找不到更好的方法了。

3)當數列a和數列b元素全部相等時(a1=b1=a2=b2...=an=bn),無法贏也不輸。

現在假設n匹馬時拿最慢的馬來和齊王最快的馬比有最優解,證明有n+1匹馬時拿最慢的馬來和齊王最快的馬比也有最優解。

數列
a1 a2 a3 a4...an an+1
b1 b2 b3 b4...bn bn+1

其中ai>=ai-1,bi>=bi-1

數列a和數列b不全部相等時,拿最慢的馬來和齊王最快的馬比數列得到數列
(a1) a2 a3 a4...an an+1
b1 b2 b3 b4...bn (bn+1)

分4種情況討論
1.b1=b2,an=an+1


則有
a2 a3 a4...an
b2 b3 b4...bn


其中a2>=a1,a1=b1,b1=b2,得a2>=b2(此後這種大小關係不再論述),an>=bn.
此時若a2=b1,根據歸納假設,有最優解,否則a2>根據前面“公理”論證有最優解。
當且僅當a數列,b數列元素全部相等時有an+1=b1,已證得,所以an+1>b1,贏回最慢的馬來和齊王最快的馬比輸的那一場。

2.b1<=b2,an=an+1
交換 b1,b2的位置,


數列
(a1) a2 a3 a4...an an+1
b2 b1 b3 b4...bn (bn+1)
此時 a2>=a1,an>=bn,


對於子表
a2 a3 a4...an
b1 b3 b4...bn
根據前面“公理”或歸納假設,有最優解。


an+1>=b2,當且僅當b2=b3=b4=..=bn+1時有an+1=b2,這種情況,a中其它元素<=b1,b2,b3,b4..bn,對於這部分來說,能贏x盤(x<=n),假如不拿最慢的馬來和齊王最快的馬比則拿最快的馬來和齊王最快的馬比,此時平一盤,能贏x-1盤,而拿最慢的馬來和齊王最快的馬比,輸一盤能贏x盤,總的來說,還是X這個數,沒有虧。

3.b1=b2,an<=an+1


4.b1<=b2,an<=an+1證明方法類似,不再重複。

以證得當有n+1匹馬的時候,田忌和齊王最快最慢的馬速度相等時,拿最慢的馬來和齊王最快的馬比有最優解,已知當n=2時成立,所以對於n>2且為整數(廢話,馬的只數當然是整數)時也成立。當n=1時....這個似乎不用討論.