[DP][博弈][后缀和]JZOJ 5778 没有硝烟的战争

Description

被污染的灰灰草原上有羊和狼。有N只动物围成一圈,每只动物是羊或狼。
该游戏从其中的一只动物开始,报出[1,K]区间的整数,若上一只动物报出的数是x,下一只动物可以报[x+1,x+K]区间的整数,游戏按顺时针方向进行。每只动物报的数字都不能超过M。若一只动物报了M这个数,它所在的种族就输了。问以第i只动物为游戏的开始,最后哪种动物会赢?

Input

第一行输入三个正整数N,M,K。
接下来一行N个正整数,分别表示N只动物的种类,以顺时针的方向给出。0代表羊,1代表狼。

Output

一行输出N个整数,表示若从第i只动物开始,赢的动物的种类。同上,0代表羊,1代表狼。

Sample Input

Input 1
2 9 2
0 1
Input 2
6 499 5
1 0 0 1 1 0
Input 3
10 100 10
0 0 0 1 1 1 1 0 1 1
 

Sample Output

Output 1
0 1
Output 2
0 1 1 1 1 0
Output 3
1 1 1 1 1 1 1 1 1 1
 

Data Constraint

对于60%的数据,1 ≤ N, M, K ≤ 500。
对于100%的数据,1 ≤ N, M, K ≤ 5000。

分析

这题我居然打了SG函数。。(其实也是类SG函数吧)

打完才想起来SG函数只适用于双方是交替进行操作的,GG,爆零

然后正解是DP

设f[i][j]为第i位选择j数字的局面:0表示先手必败,1表示先手必胜

显然初始值f[][m]=0

然后显然转移方程为f[i][j]=f[i+1][j+1~j+k]……

分类讨论:

如果i+1为同类,那么j+1~j+k之间有必胜局面时,f[i][j]也必胜

异类则相反

如何得知j+1~j+k有无必胜局面?

我们用一个后缀和维护就行

#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
const int N=5001;
bool f[N][N];
int b[N],s[N][N];
int n,m,k;

int main() {
    freopen("vode.in","r",stdin);
    freopen("vode.out","w",stdout);
    scanf("%d%d%d",&n,&m,&k);
    for (int i=0;i<n;i++) scanf("%d",&b[i]);
    for (int j=m-1;j>0;j--)
    for (int i=0;i<n;i++) {
        if (b[i]==b[(i+1)%n])
        f[i][j]=(s[(i+1)%n][j+1]-s[(i+1)%n][min(m,j+k)+1])?1:0;
        else
        f[i][j]=(s[(i+1)%n][j+1]-s[(i+1)%n][min(m,j+k)+1])?0:1;
        s[i][j]=s[i][j+1]+f[i][j];
    }
    for (int i=0;i<n;i++) {
        bool ans=0;
        for (int j=1;j<=k;j++)
        ans|=f[i][j];
        printf("%d ",!(b[i]^ans));
    }
    fclose(stdin);fclose(stdout);
} 

原文地址:https://www.cnblogs.com/mastervan/p/9445430.html

时间: 2024-10-31 04:00:04

[DP][博弈][后缀和]JZOJ 5778 没有硝烟的战争的相关文章

hdu4753 状态压缩dp博弈(记忆化搜索写法)

http://acm.hdu.edu.cn/showproblem.php?pid=4753 Problem Description There is a 3 by 3 grid and each vertex is assigned a number. It looks like JiuGongGe, but they are different, for we are not going to fill the cell but the edge. For instance, adding

双11是结束了,但这场没有硝烟的“战争”却没有结束

229秒,销售额破亿: 26分钟,完成"双11"跨境配送首单: 78分钟,超过2017年"双11"全天销售额: 全平台销售额达到去年同期2.4倍 -- 这是网易考拉在双11交出的成绩单.靓丽的成绩单,是网易考拉技术.运营还有产品同学上上下下共同努力的成果.当然,背后也有网易安全部和网易云易盾的同学参与进来,做各种安全保障工作. 生活中到处都有黄牛,网络上也同样存在着黄牛,他们被称为羊毛党.这群人对商家的促销和优惠特别敏锐,闻风而动,给新.老用户的福利,眨眼间就能被他

一场没有硝烟的战争

-- 写给即将远去的2016以及前方的2017 人的一生,和时间,一直在进行着一场没有硝烟的战争.这场战争,时快时慢,时而真实而残酷,时而浪漫且幸福,时而痛彻心扉,时而快乐地无法抑制. 与时间的战争,看似时间是我们的敌人,其实真正的敌人是我们自己.时间,它以摧枯拉朽之力风卷残云般清除着所有横亘在它之前的一切障碍.不针对任何人,它只是规律的最好执行者,不管我们愿意或者不愿意,准备好与否,生老病死,都将在时间铁面无私的执行下如期而至. 人生就像一辆开往未来的单程列车,我们在用这一生去完成这对谁都是只

hdu4778:状压dp+博弈

题目大意: 有g种不同颜色的小球,b个袋子,每个袋子里面有若干个每种小球 两人轮流取袋子,当袋子里面的同色小球有s个时,会合并成一个魔法球,并被此次取袋子的人获得 成功获得魔法球的人可以再次取 求二者都进行最优策略之后两人所得魔法球个数差 分析: 博弈,数据很小,自然想到了可以搜索所有状态 然后从每一步的子状态中找到对当前人(这一步的先手)最有利的状态即可 直接搜索还是会超时的,于是想到用状态压缩一下,做记忆化搜索 然后其实就是一个状压dp了 通过某个状态对于先手的最优子状态进行转移.. 代码如

【POJ2068】Nim DP博弈

题意: 多组数据 两人轮流操作,n轮一循环,给出总石子数和这n轮每次两人能取的石子上限(下限为1). 取到最后一颗者输. 比如 3 97 8 7 6 5 4 3 表示一循环有三轮, 可取的个数为: 第一轮 先手8 后手7 第二轮 先手6 后手5 第三轮 先手4 后手3 然后三轮每取完的话就进入下次循环. 数据范围自己看去吧. 题解: DP就好. 博弈性质:如果当前状态对手怎么走都败,此状态就是胜,不然就是负. 记忆化搜索一下水过. 代码: #include <cstdio> #include

UVA 10891 区间DP+博弈思想

很明显带有博弈的味道.让A-B最大,由于双方都采用最佳策略,在博弈中有一个要求时,让一方的值尽量大.而且由于是序列,所以很容易想到状态dp[i][j],表示序列从i到j.结合博弈中的思想,表示初始状态i->j情况下,先手能获得的最大分数.后手能获得的就是sum[i][j]-dp[i][j].接下来枚举先手选取的是两端的哪一段即可. #include <iostream> #include <cstdio> #include <cstring> using name

JZOJ 5778

Description 被污染的灰灰草原上有羊和狼.有N只动物围成一圈,每只动物是羊或狼. 该游戏从其中的一只动物开始,报出[1,K]区间的整数,若上一只动物报出的数是x,下一只动物可以报[x+1,x+K]区间的整数,游戏按顺时针方向进行.每只动物报的数字都不能超过M. 若一只动物报了M这个数,它所在的种族就输了.问以第i只动物为游戏的开始,最后哪种动物会赢? Input 第一行输入三个正整数N,M,K. 接下来一行N个正整数,分别表示N只动物的种类,以顺时针的方向给出.0代表羊,1代表狼. O

POJ 2068 Nim#双人dp博弈

http://poj.org/problem?id=2068 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[25][(1<<13)+5];//dp[i][j]表示轮到第i个人取时,剩j个石头 int n,s,m[25]; int DFS(int pos,int remain) { if(dp

UVa 12525 Boxes and Stones (dp 博弈)

Boxes and Stones Paul and Carole like to play a game with S stones and B boxes numbered from 1 to B. Beforebeginning the game they arbitrarily distribute the S stones among the boxes from 1 to B - 1, leavingbox B empty. The game then proceeds by roun