https://vjudge.net/contest/171652#problem/K

【题意】

  • 小岛上有n个人,有些是好人(一定是真话),有些是坏人(可能是真话也可能是假话),现在要判断最多有多少好人
  • 每个人说话有四种形式:
  • 1. Person i: Person x is a good guy.
  • 2. Person i: Person x is a bad guy.
  • 3. Person i: If person x is a good guy, person y is a good guy. 
  • 4. Person i: If person x is a bad guy, person y is a bad guy. 
  • 从2到n依次考察n-1个人
  • 对于第i个人,他知道的信息只有从max(i-k,1)到i-1
  • 0 <= N <= 5000,1 <= K <= 10

【思路】

  • 对于第i个人,他只知道max(i-k,1)到i-1个人的信息,k最多是10。用1表示好人,0表示坏人,max(i-k,1)到i-1个人的信息可以状压保存,高位是编号大的人
  • dp[i][j]表示考察到第i个人时,状态为j(最高位为i的状态)时好人最多是多少个
  • 初始化:对于第一个人,可能是好人也可能是坏人,所以第k位为1时,第一个人是好人,dp为1;第k位为0时,dp为0
  • 状态转移:如果第i个人说的话与max(i-k,1)到i-1本身的信息相符,说第i个人可能是好人,状态转移为,右移并且最高位置1,好人数增加一个;不管相符还是不符,第i个都可能是坏人,状态转移为,右移一位最高位置0,好人数不增加
  • 注意第四种说话方式时,只有if 符合而then不符合,可以确定当前人一定不是好人,否则都有可能是好人

【Accepted】

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
#include<cmath> using namespace std;
const int maxn=5e3+;
int dp[maxn][];
int n,k;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
memset(dp,-,sizeof(dp));
scanf("%d%d",&n,&k);
for(int i=,mx=(<<(k-));i<mx;i++)
{
dp[][i]=;
}
for(int i=(<<(k-)),mx=(<<k);i<mx;i++)
{
dp[][i]=;
}
for(int i=;i<=n;i++)
{
char str[];
int x,y,dx,dy;
scanf("%s%d%s%s",str,&x,str,str);
if(str[]=='P')
{
scanf("%d%s%s%s",&x,str,str,str);
if(str[]=='g') dx=;
else dx=;
for(int j=,mx=(<<k);j<mx;j++)
{
if(((j>>(x-i+k))&)==dx)
{
dp[i][(j+mx)>>]=max(dp[i][(j+mx)>>],dp[i-][j]+);
}
dp[i][j>>]=max(dp[i][j>>],dp[i-][j]);
}
scanf("%s",str);
}
else
{
scanf("%s%d%s%s%s",str,&x,str,str,str);
if(str[]=='g') dx=;
else dx=;
scanf("%s%s%d%s%s%s",str,str,&y,str,str,str);
if(str[]=='g') dy=;
else dy=;
scanf("%s",str);
for(int j=,mx=(<<k);j<mx;j++)
{
if(!((((j>>(x-i+k))&)==dx)&&(((j>>(y-i+k))&)!=dy)))
{
dp[i][(j+mx)>>]=max(dp[i][(j+mx)>>],dp[i-][j]+);
}
dp[i][j>>]=max(dp[i][j>>],dp[i-][j]);
}
}
}
int ans=;
for(int i=,mx=(<<k);i<mx;i++)
{
ans=max(ans,dp[n][i]);
}
printf("%d\n",ans);
}
return ;
}

状压DP

【状压DP】OpenJ_POJ - C17K Lying Island的更多相关文章

  1. BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS

    BZOJ_3049_[Usaco2013 Jan]Island Travels _状压DP+BFS Description Farmer John has taken the cows to a va ...

  2. openJudge C17K:Lying Island

    地址:http://poj.openjudge.cn/practice/C17K/ 题目: C17K:Lying Island 查看 提交 统计 提问 总时间限制:  2000ms 内存限制:  26 ...

  3. [tyvj2054] 四叶草魔杖 (最小生成树 状压dp)

    传送门 Background 陶醉在彩虹光芒笼罩的美景之中,探险队员们不知不觉已经穿过了七色虹,到达了目的地,面前出现了一座城堡和小溪田园,城堡前的木牌上写着"Poetic Island&q ...

  4. BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]

    1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3336  Solved: 1936[Submit][ ...

  5. nefu1109 游戏争霸赛(状压dp)

    题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...

  6. poj3311 TSP经典状压dp(Traveling Saleman Problem)

    题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...

  7. [NOIP2016]愤怒的小鸟 D2 T3 状压DP

    [NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...

  8. 【BZOJ2073】[POI2004]PRZ 状压DP

    [BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...

  9. bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)

    数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...

随机推荐

  1. Ionic之存储信息、取出存储信息、注销存储信息

    每一个app软件在登录的时候,都会本地存储登录信息,需要用到数据的时候,就直接在本地获取,而不是每一次应用的时候都要请求到服务器来验证登录信息,减少服务器的负担.所以在设计混合HTML5 移动应用程序 ...

  2. P1838 三子棋I

    题目描述 小a和uim喜欢互相切磋三子棋.三子棋大家都玩过是吗?就是在九宫格里面OOXX(别想歪了),谁连成3个就赢了. 由于小a比较愚蠢,uim总是让他先. 我们用9个数字表示棋盘位置: 123 4 ...

  3. subprocess模块详解2

    1.call() 和run功能类似,都是接受一个列表里的参数. >>> import subprocess >>> a = subprocess.call([&qu ...

  4. 洛谷 P1765 手机_NOI导刊2010普及(10)

    题目描述 一般的手机的键盘是这样的: 1 2 abc 3 def 4 ghi 5 jkl 6 mno 7 pqrs 8 tuv 9 wxyz * 0 # 要按出英文字母就必须要按数字键多下.例如要按出 ...

  5. 基于SAE的Python+Django部署

    本文主要参考:http://www.cnblogs.com/qtsharp/archive/2012/01/12/2320774.html,另外包括自己的实际操作. 一.申请SAE帐号以及创建应用ya ...

  6. html自己写响应式布局(说起来很高大上的样子,但是其实很简单)

    第一步,打开电脑中安装的Sublime Text3,新建demo文件夹用来存放文件,在里面新建一个HTML文件,通过Tab快捷键迅速创建一个HTML模板,并命名标题. 第二步,在Body标签里添加三个 ...

  7. iview modal 弹框 模板

    iview modal 弹框 模板 <!-- * @description 上传图片 * @fileName camera.vue * @author 彭成刚 * @date // :: * @ ...

  8. Spring JDBC 例子

    http://www.yiibai.com/spring/spring_jdbc_example.html 要了解有关Spring JDBC框架与JdbcTemplate类的概念,让我们写这将实现所有 ...

  9. js div大小随意伸缩

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  10. Spring中RestTemplate的使用方法

    一.REST 在互联网中,我们会通过请求url来对网络上的资源做增删改查等动作,这里的请求包含两部分:动词,主要包括增.删.改.查:名词,就是网络中的各种资源.传统的非REST风格的请求方式是把动词和 ...