洛谷 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;
}
原文地址:https://www.cnblogs.com/yinyuqin/p/14880226.html