C17K:Lying Island
题意:
有n个人,每个人可能会说:
- 第x个人是好人/坏人
- 如果第x个人是好人/坏人,则第y个人是好人/坏人
思路:
状压dp,首先每个人所说的人只能是他前面10个人,所以对于第i个人记录下,他前面十个人的情况。
对于第i个人,如果他说的话一个状态不冲突,那么i可以由这个状态转移。
注意:对于“如果第x个人是好人,那么第y个人是坏人 “,那么x是好人,y是好人是不满足的。但是除了x是好人y是坏人这种情况满足,x是坏人,也是满足的。(一定要学好语文!)
代码
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<iostream>
#include<cmath> using namespace std; int dp[][];
char str[];
int k; void work1(int i,int x,int z) {
int t = ( << k);
for (int j=; j<t; ++j) {
if (((j>>(x-i+k))&)==z) dp[i][(j+t)>>] = max(dp[i][(j+t)>>],dp[i-][j]+);
dp[i][j>>] = max(dp[i][j>>],dp[i-][j]);
}
}
void work2(int i,int x,int y,int z1,int z2) {
int t = ( << k);
for (int j=; j<t; ++j) {
int t1 = ((j>>(x-i+k))&) == z1,t2 = ((j>>(y-i+k))&) != z2;
if (!(t1&&t2)) dp[i][(j+t)>>] = max(dp[i][(j+t)>>],dp[i-][j]+);
dp[i][j>>] = max(dp[i][j>>],dp[i-][j]);
}
}
int main() {
int T,n,x,y,z;
scanf("%d",&T);
while (T--) {
scanf("%d%d",&n,&k);
memset(dp,-,sizeof(dp));
for (int j=,t=(<<(k-)); j<t; ++j) dp[][j] = ;
for (int j=(<<(k-)),t=(<<k); j<t; ++j) dp[][j] = ; for (int i=; i<=n; ++i) {
scanf("%s%s%s%d",str,str,str,&x);
if (str[]=='P') {
scanf("%s%s%s",str,str,str);
if (str[]=='g') z = ;
else z = ;
scanf("%s",str);
work1(i,x,z);
}
else {
scanf("%s%d%s%s%s",str,&x,str,str,str);
if (str[]=='g') z = ;
else z = ;
scanf("%s%s%d%s%s%s",str,str,&y,str,str,str);
work2(i,x,y,z,str[]=='g');
scanf("%s",str);
}
}
int ans = ;
for (int i=,t=(<<k); i<t; ++i) ans = max(ans,dp[n][i]);
printf("%d\n",ans);
}
return ;
}
C17K:Lying Island的更多相关文章
- openJudge C17K:Lying Island
地址:http://poj.openjudge.cn/practice/C17K/ 题目: C17K:Lying Island 查看 提交 统计 提问 总时间限制: 2000ms 内存限制: 26 ...
- 【状压DP】OpenJ_POJ - C17K Lying Island
https://vjudge.net/contest/171652#problem/K [题意] 小岛上有n个人,有些是好人(一定是真话),有些是坏人(可能是真话也可能是假话),现在要判断最多有多少好 ...
- PKU_campus_2017_K Lying Island
思路: 题目链接http://poj.openjudge.cn/practice/C17K/ 状压dp.dp[i][j]表示第i - k人到第i人的状态为j的情况下前i人中最多有多少好人. 实现: # ...
- uva 592 Island of Logic (收索)
Island of Logic The Island of Logic has three kinds of inhabitants: divine beings that always tel ...
- LightOJ 1418 Trees on My Island (Pick定理)
题目链接:LightOJ 1418 Problem Description I have bought an island where I want to plant trees in rows an ...
- [LeetCode] Island Perimeter 岛屿周长
You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 represen ...
- 463. Island Perimeter
https://leetcode.com/problems/island-perimeter/ 在一个N×N的矩阵中,N<100,1代表岛,0代表海,岛内没有海,求岛的周长 [[0,1,0,0] ...
- Leetcode-463 Island Perimeter
#463. Island Perimeter You are given a map in form of a two-dimensional integer grid where 1 represe ...
- LeetCode Island Perimeter
原题链接在这里:https://leetcode.com/problems/island-perimeter/ 题目: You are given a map in form of a two-dim ...
随机推荐
- sudoers文件解析
分类: LINUX 今天在用户组中新加了一个普 通用户,开始这个用户没有sudo权限,于是通过sudo visudo修改了sudo的配置文件,赋予了普通用户的root权限.后来想着能不能将/etc/s ...
- 07、Spark集群的进程管理
07.Spark集群的进程管理 7.1 概述 Spark standalone集群模式涉及master和worker两个守护进程.master进程是管理节点,worker进程是工作节点.spark提供 ...
- VOS3000设置落地网关优先级
问题描述: 现在有两种套餐卡A:无限通话B:每月3000分钟两个落地网关:GW100:32线用的A套餐GW101:32线用的B套餐 比如现在是12月5号还没到月底,突然发现GW101上所剩可用通话时间 ...
- 在android开发中如何使用JavaMail程序
javaMail,是提供给开发者处理电子邮件相关的编程接口.它是Sun发布的用来处理email的API.它可以方便地执行一些常用的邮件传输.我们可以基于JavaMail开发出类似于Microsoft ...
- Sublime Text3 + Markdown + 实时预览
Sublime Text3是一款给力的文本编辑器,通过安装插件可以编辑Markdown文本,在编辑Markdown文本的同时可以实时预览编辑效果. 安装准备: 找到菜单栏:Preferences → ...
- golang实现文件上传权限验证(超简单)
Go语言创建web server非常简单,部署也很容易,不像IIS.Apache等那么重量级,需要各种依赖.配置.一些功能单一的web 服务,用Go语言开发特别适合.http文件上传下载服务,在很多地 ...
- Fiddler-1 官网下载及安装
1 进入Fiddler官网:http://www.telerik.com/fiddler 点击[Free download]:填写一些信息后就可以下载. 2 双击安装包--下一步dinghanhua下 ...
- poj 3485 区间选点
题目链接:http://poj.org/problem?id=3485 题意:X轴上公路从0到L,X轴上下有一些点给出坐标代表村庄,问在公路上最少建几个出口才能使每个村庄到出口的距离不超过D. 以村庄 ...
- php无法保存SESSION问题总汇
昨天客户又过来说网站的问题,说的也都是些毛毛雨的东西,管理那么多网站,再有这么些客户的存在,本人也是累了,但当登录后台的时候突然发现后台登录不了,查看了一下验证码服务器端的session为空值,之前登 ...
- which,whereis,locate,find
which 查看可执行文件的位置 [root@redhat ~]# which passwd /usr/bin/passwd which是通过 PATH 环境变量到该路径内查找可执行文件,所 ...