链接

题意:

  有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的更多相关文章

  1. openJudge C17K:Lying Island

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

  2. 【状压DP】OpenJ_POJ - C17K Lying Island

    https://vjudge.net/contest/171652#problem/K [题意] 小岛上有n个人,有些是好人(一定是真话),有些是坏人(可能是真话也可能是假话),现在要判断最多有多少好 ...

  3. PKU_campus_2017_K Lying Island

    思路: 题目链接http://poj.openjudge.cn/practice/C17K/ 状压dp.dp[i][j]表示第i - k人到第i人的状态为j的情况下前i人中最多有多少好人. 实现: # ...

  4. uva 592 Island of Logic (收索)

      Island of Logic  The Island of Logic has three kinds of inhabitants: divine beings that always tel ...

  5. 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 ...

  6. [LeetCode] Island Perimeter 岛屿周长

    You are given a map in form of a two-dimensional integer grid where 1 represents land and 0 represen ...

  7. 463. Island Perimeter

    https://leetcode.com/problems/island-perimeter/ 在一个N×N的矩阵中,N<100,1代表岛,0代表海,岛内没有海,求岛的周长 [[0,1,0,0] ...

  8. Leetcode-463 Island Perimeter

    #463. Island Perimeter You are given a map in form of a two-dimensional integer grid where 1 represe ...

  9. LeetCode Island Perimeter

    原题链接在这里:https://leetcode.com/problems/island-perimeter/ 题目: You are given a map in form of a two-dim ...

随机推荐

  1. UI5 Source code map机制的细节介绍

    在我的博客A debugging issue caused by source code mapping里我介绍了在我做SAP C4C开发时遇到的一个曾经困扰我很久的问题,最后结论是这个问题由于Jav ...

  2. 数长方形有多少个?POJ(1693)

    题目链接:http://poj.org/problem?id=1693 解题报告: 随机选两根横的,再找一下与这两根横线相交的竖线有多少根,m,那么就有(m-1)*m/2个长方形. #include ...

  3. python_1_变量的使用

    print("hello word") name="Qi Zhiguang" print("My name is",name) name2= ...

  4. redis string类型

  5. Java的感受

    感觉Java很重要,但是学起来好像并不比C语言简单.

  6. 字符串比较操作类StringComparer

    StringComparer这个字符串比较操作类.它继承了四种接口IComparer, IEqualityComparer, IComparer<string>, IEqualityCom ...

  7. 简单使用hibernate(idea中使用)

    首先创建一个maven项目 创建成功后,进行创建数据库的表 CREATE TABLE BOOK( ID INT AUTO_INCREMENT PRIMARY KEY, NAME ), NUMBER i ...

  8. 旧文备份:Python国际化支持

    Python通过gettext模块支持国际化(i18n),可以实现程序的多语言界面的支持,下面是我的多语言支持实现: 在python安装目录下的./Tools/i18n/(windows下例 D:\P ...

  9. 第39章 ETH—Lwip以太网通信—零死角玩转STM32-F429系列

    第39章     ETH—Lwip以太网通信 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...

  10. 清除ie10+浏览器的input输入框后面会出现的x号和闭眼logo

    x号:::-ms-clear{display:none;} 闭眼logo: ::-ms-reveal{display:none;} tips:如果在外部引用的css里面没有作用,可以在写本页面的< ...