【状压DP】OpenJ_POJ - C17K Lying Island
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的更多相关文章
- 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 ...
- openJudge C17K:Lying Island
地址:http://poj.openjudge.cn/practice/C17K/ 题目: C17K:Lying Island 查看 提交 统计 提问 总时间限制: 2000ms 内存限制: 26 ...
- [tyvj2054] 四叶草魔杖 (最小生成树 状压dp)
传送门 Background 陶醉在彩虹光芒笼罩的美景之中,探险队员们不知不觉已经穿过了七色虹,到达了目的地,面前出现了一座城堡和小溪田园,城堡前的木牌上写着"Poetic Island&q ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
- 【BZOJ2073】[POI2004]PRZ 状压DP
[BZOJ2073][POI2004]PRZ Description 一只队伍在爬山时碰到了雪崩,他们在逃跑时遇到了一座桥,他们要尽快的过桥. 桥已经很旧了, 所以它不能承受太重的东西. 任何时候队伍 ...
- bzoj3380: [Usaco2004 Open]Cave Cows 1 洞穴里的牛之一(spfa+状压DP)
数据最多14个有宝藏的地方,所以可以想到用状压dp 可以先预处理出每个i到j的路径中最小权值的最大值dis[i][j] 本来想用Floyd写,无奈太弱调不出来..后来改用spfa 然后进行dp,这基本 ...
随机推荐
- idea DeBug调试学习
在Intellij IDEA中使用Debug 目录 一.Debug开篇 二.基本用法&快捷键 三.变量查看 四.计算表达式 五.智能步入 六.断点条件设置 七.多线程调试 八.回退断点 九.中 ...
- AJPFX简述JavaStringBuffer方法
以下是StringBuffer类支持的主要方法: 序号 方法描述 1 public StringBuffer append(String s)将指定的字符串追加到此字符序列. 2 public Str ...
- Masonry自动布局与UIScrolView适配
Masonry介绍 Masonry是一个轻量级的布局框架 拥有自己的描述语法 采用更优雅的链式语法封装自动布局 简洁明了 并具有高可读性 而且同时支持 iOS 和 Max OS X.可以通过cocoa ...
- sybase sql anywhere 5.0 安装后sybase central中无法打开视图等的解决办法
无法打开的原因初步分析要用英文版的xp,后来在如下处发现问题,是sql anywhere的版本太旧了, 可能没有使用Unicode编码,设置一下如下选项可以解决问题.
- Django创建第一个应用
一.创建第一个应用,并在settings.py中添加. python manage.py startapp article 二.创建第一个模型 class Article(models.Model): ...
- how to make a function from using global var to not using it
let say, we want to find the bottom left node in a tree.one way to do it is using global vars: /** * ...
- centos下安装nodejs的三种种方式
方法一:源码包安装 官网下载 centos下载最新版10.9 https://nodejs.org/dist/v10.9.0/node-v10.9.0-linux-x64.tar.xz mkdir / ...
- Ubuntu 18的网络配置
包括Ubuntu 18.04和18.10,设置为静态IP及DNS. sudo vim /etc/netplan/50-cloud-init.yaml network: ethernets: enp4s ...
- (待解决)IDEA配置JDBC查询数据库PreparedStatement pstmt = dbconn.prepareStatement(sql)出现空指针错误
package com.demo; import java.io.*; import java.sql.*; import java.util.*; import javax.servlet.*; i ...
- oracle插入多表(insert all/first)
1.建测试表 CREATE TABLE EDW_INT ( AGMT_NO VARCHAR2(40 BYTE) NOT NULL, AG ...