洛谷 P1288 取数游戏II(博弈论)
传送门
解题思路
设置状态(x--你在这里--y)表示所处的点两边的边权分别为x和y
考虑终止状态(0--你在这里--0)能由什么状态转移过来:
- (k--你在这里--x---0)经过边x并把边x的边权设置为0 -->必胜
(貌似就一种)
很显然每次都会选择使经过的边权为0(否则先手等于把先手权交到了对方手中或者直接失败)(重点,敲黑板)
所以实际上答案就和起始位置向左或向右到边权为0的边的奇偶性有关(有一边是奇数先手即可获胜)。
AC代码
#include<cstdio>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cmath>
#include<algorithm>
using namespace std;
int n,a[25],cnt1,cnt2;
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++){
if(a[i]==0) break;
cnt1++;
}
for(int i=n;i>=1;i--){
if(a[i]==0) break;
cnt2++;
}
if(cnt1&1||cnt2&1) cout<<"YES";
else cout<<"NO";
return 0;
}