/*
題意:有n堆石子,每堆石子有乙個數目,現有兩個人博弈,每個人每次可以進行兩個操作中的乙個:
1、從某堆拿掉乙個石子(若某堆石子為0了,那麼這堆就不存在了);2、合併兩堆石子
沒有操作的就輸。問是哪個贏
思想:如果每堆石子數都大於1,那麼最後結果肯定相當於所有的堆合併成一堆後,然後再乙個乙個拿掉的結果。
因為如果那種情況是贏的人一定會不斷合併堆來確保他是贏的。又因為所有堆的石子數都大於1,所以輸的人無法阻止他這麼幹。
而有些堆石子數等於1的話,就不一定是所有的合併的結果了,因為輸的人可以直接把等於1的堆去掉,就破壞了結構
(合併相當於2步,去掉只需要1步)。
dp[i][j]表示有i個石子數為1的堆數,其它堆合併再取完的步數為j。若值為1則先取者勝,為0為先取者輸
*/#include#include#include#includeusing namespace std;
int dp[55][55000];
int a[55];
int dp(int a,int b)
int main()
if(k) k--;//合併的次數多算了一次
dp(j,k);
printf("case #%d: ",test++);
if(dp[j][k]) printf("alice\n");
else printf("bob\n");
} return 0;
}
hdu 4288 2012成都網路賽
線段樹學的遠遠不夠啊,網路賽的時候一直不知道怎麼做,後來看了大神報告,才學了一下。線段樹每個節點 記錄 sum 0.5 即位置mod 5 的5種結果的數對應的和。cnt記錄區間有多少個數。更新的時候 只要把對應子區間的sum i 加起來就可以了 include includeusing namesp...
11年成都網路賽
今天把去年成都的網路賽做了一下,去年是一題不會哇,現在也挺吃力,還有幾題不會,有空再來看 attack 樹狀陣列,這題樹狀陣列節點n記錄的是wall n 和wall n 1 被炮擊的差 include include include includeusing namespace std define...
11年成都網路賽
今天把去年成都的網路賽做了一下,去年是一題不會哇,現在也挺吃力,還有幾題不會,有空再來看 attack 樹狀陣列,這題樹狀陣列節點n記錄的是wall n 和wall n 1 被炮擊的差 include include include includeusing namespace std define...