題目連接:http://poj.org/problem?id=2484spa
這道題目大意是這樣的,有n個硬幣圍成一圈,兩我的輪流開始取硬幣(假設他們編號從1到n),能夠選擇取一枚或者取相鄰的兩枚(相鄰是指他們的編號相鄰)。在雙方都採起最優策略取硬幣的狀況下,問誰最後會贏。code
這道題目我一開始沒有什麼好的辦法,n從1試到7,大體能發現n>=3的時候是Bob贏,不然是Alice贏。blog
但是爲何這樣寫正確呢?有沒有嚴格一些的證實呢?get
我查閱了許多資料,有了下邊的理解,可能不是很準確,望糾正。class
n<=3的時候顯然易得。di
當n>3時,咱們分紅兩種狀況討論。co
當n爲偶數。咱們能夠把硬幣環斷開平均分紅兩列。printf
先手先取,先手不管取一個仍是兩個硬幣(此時無所謂最優了,或者說都是最優),對方的最優策略老是跟着先手去相同數量的硬幣,這樣保證最後一個硬幣是被後手拿掉。後手贏。tar
當n爲奇數,若是先手取一個硬幣,那麼後手爲了贏,他必需要想辦法轉化成n爲偶數的狀況,因此他取兩個硬幣;
若是先手取兩個硬幣,那麼後手爲了贏,他必需要想辦法轉化成n爲偶數的狀況,因此他取一個硬幣;
日後的過程就與上邊分析的偶數狀況一致了。
綜上分析,獲得咱們的正確答案;
1 if(n>=3) printf("Bob"); 2 else printf("Alice");