[CF991D]Bishwock_状压dp
Bishwock
题目链接:http://codeforces.com/problemset/problem/991/D
数据范围:略。
题解:
一眼题。
首先,每个$L$最多只占用两列,而且行数特别少,我们考虑状态压缩。
即$f_{i, S}$表示前$i$列,第$j$列的状态为$S$时,前$j$最多能放多少个。
随便弄一弄就好了。
代码:
#include <bits/stdc++.h> #define setIO(s) freopen(s".in", "r", stdin), freopen(s".out", "w", stdout) #define N 100010 using namespace std; int f[N][1 << 4], dic[4]; char s[2][N]; int main() {
// setIO("a");
scanf("%s%s", s[0] + 1, s[1] + 1);
int n = strlen(s[0] + 1);
int all = (1 << 4) - 1;
for (int i = 0; i < 4; i ++ ) {
dic[i] = all - (1 << i);
}
for (int i = 2; i <= n; i ++ ) {
int mdl = 0;
if (s[0][i - 1] == 'X') {
mdl += 1;
}
if (s[1][i - 1] == 'X') {
mdl += 2;
}
if (s[0][i] == 'X') {
mdl += 4;
}
if (s[1][i] == 'X') {
mdl += 8;
}
// cout << mdl << endl ;
for (int s1 = 0; s1 < (1 << 2); s1 ++ ) {
for (int s2 = 0; s2 < (1 << 2); s2 ++ ) {
// i -> s1, i - 1 -> s2
int tmp = s2 + (s1 << 2), re = all - tmp;
if ((tmp & mdl) == mdl) {
f[i][s1] = max(f[i][s1], f[i - 1][s2]);
for (int k = 0; k < 4; k ++ ) {
if ((dic[k] & re) == dic[k]) {
int x = s2;
if (dic[k] & 1) {
x ++ ;
}
if (dic[k] & 2) {
x += 2;
}
f[i][s1] = max(f[i][s1], f[i - 1][x] + 1);
}
}
}
}
}
}
int ans = 0;
for (int i = 0; i <= all; i ++ ) {
ans = max(ans, f[n][i]);
}
cout << ans << endl ;
fclose(stdin), fclose(stdout);
return 0;
}
小结:一定要想明白状态再转移。
[CF991D]Bishwock_状压dp的更多相关文章
- 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,这基本 ...
- HDU 1074 Doing Homework (状压dp)
题意:给你N(<=15)个作业,每个作业有最晚提交时间与需要做的时间,每次只能做一个作业,每个作业超出最晚提交时间一天扣一分 求出扣的最小分数,并输出做作业的顺序.如果有多个最小分数一样的话,则 ...
- 【BZOJ1688】[Usaco2005 Open]Disease Manangement 疾病管理 状压DP
[BZOJ1688][Usaco2005 Open]Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) ...
- 【BZOJ1725】[Usaco2006 Nov]Corn Fields牧场的安排 状压DP
[BZOJ1725][Usaco2006 Nov]Corn Fields牧场的安排 Description Farmer John新买了一块长方形的牧场,这块牧场被划分成M列N行(1<=M< ...
随机推荐
- python第三方库的更新和安装指定版本
安装指定版本: pip install openpyxl==2.3.4 更新到最新版本: pip install --upgrade openpyxl
- 012_Linux驱动之_wait_event_interruptible
1. 首先这篇博客讲解得挺好的,推荐 wait_event_interruptible 使用方法 2 .函数原型: #define wait_event_interruptible(wq, condi ...
- 02 | 日志系统:一条SQL更新语句是如何执行的?
前面我们系统了解了一个查询语句的执行流程,并介绍了执行过程中涉及的处理模块.相信你还记得,一条查询语句的执行过程一般是经过连接器.分析器.优化器.执行器等功能模块,最后到达存储引擎. 那么,一条更新语 ...
- jsp显示当前系统时间
第一种方式: <% java.text.SimpleDateFormat simpleDateFormat = new java.text.SimpleDateFormat( "yyy ...
- cesium billboard跨域问题2
这篇主要是对上一篇博客cesium billboard出现跨域的原理分析 https://www.cnblogs.com/SmilingEye/p/11363837.html 1.源码位置 从Bill ...
- 5.3.3 自定义writable和RawComparatorWritable
5.3.3 自定义writable (1)构造员工writable Hadoop虽然已经实现了一些非常有用的Writable,而且你可以使用他们的组合做很多事情,但是如果你想构造一些更加复杂的结果,你 ...
- vue draggable 火狐拖拽搜索问题
最近在使用vuedraggable做导航时候,谷歌拖拽是没问题的,但是在火狐测试时候,拖拽时候是可以成功,但是火狐还是打开了一个新的tab,并且搜索了,一开始想着是阻止默认行为,但是在@end时间中阻 ...
- DBeaver 客户端中时间显示问题解决
最近工作使用了一段时间的macOS,换了新的数据库客户端 DBeaver,无意中发现客户端显示时间不正确.时间保存之后显示比实际时间多13个小时整.可以判断是时区没有配置正确.无意中发现是DBeave ...
- Mysql表的横向拆分与纵向拆分
表的拆分分为横向拆分(记录的拆分)和纵向拆分(字段的拆分).拆分表的目的:提高查询速度. 1.横向拆分 我们从一个案例去解释,情景是这样的:某某博客,有50W的博客量,有2w的用户,发现随着用户和博客 ...
- busybox中memdev的使用方法
busybox中已经集成了devmem工具,你可以配置busybox即可. 在busybox的杂项中找到: CONFIG_USER_BUSYBOX_DEVMEM: devmem is a small ...