版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_41709770/article/details/81515631
题目
题解
–好像有点玄学?这是本蒟蒻做的第一道博弈题耶,没办法,就当是定义记呗
首先对于A,如果B的选择里有必败策略,那A必胜(黑人???)
那就分为相邻两动物是同种还是异种
如果是同种,如果B有必胜策略,A也必胜
如果是异种,如果B有必败策略,A也必胜
然后把换拆成链
用后缀和优化一下
再把从i开始看成是先报一个0就好
答案就是f[i][0]
那就直接dp啦
啦啦啦啦
代码
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<cstring>
using namespace std;
const int MAXN=5005;
int n,m,k;
int a[MAXN];
int f[MAXN][MAXN];
int sum[MAXN][MAXN];
int next(int x){
if(x==n)
return 1;
return x+1;
}
int main(){
freopen("vode.in","r",stdin);
freopen("vode.out","w",stdout);
cin>>n>>m>>k;
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int j=m-2;j>=0;j--){
for(int i=1;i<=n;i++){
int l=j+1,r=min(m-1,j+k);
if(a[next(i)]!=a[i]&&sum[next(i)][l]-sum[next(i)][r+1]<r-l+1)
f[i][j]=1;
if(a[next(i)]==a[i]&&sum[next(i)][l]-sum[next(i)][r+1]>0)
f[i][j]=1;
sum[i][j]=sum[i][j+1]+f[i][j];
}
}
for(int i=1;i<=n;i++){
if(f[i][0])
printf("%d ",a[i]);
else
printf("%d ",1-a[i]);
}
return 0;
}