UVA - 11270 轮廓线DP
其实这题还能用状压DP解决,可是时间达到2000ms只能过掉POJ2411.状压DP解法详见状压DP解POJ2411
贴上POJ2411AC代码 : 2000ms 时间复杂度h*w*(2^w)*(2^w)
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <utility>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<int, int>
typedef long long LL;
const int maxn = 1 << 11;
LL dp[12][maxn];
int w, h;
bool TestFirstLine(int state) {
for(int i = 0; i < w;) {
int x = 1 << i;
if((x & state) && i+1 < w && ((x << 1) & state)) {
i += 2;
}
else if(!(x & state)) ++i;
else return false;
}
return true;
}
bool is_ok(int state1, int state2) {
for(int i = 0; i < w;) {
int x = 1 << i;
if(!(x & state1)) {
if(!(x & state2)) return false;
++i;
}
else {
int y = x << 1;
if(!(x & state2)) ++i;
else if(x & state2) {
if(i == w-1 || !(y & state1) || !(y & state2)) return false;
i += 2;
}
}
}
return true;
}
LL solve() {
if(h < w) swap(w, h);
int r = 1 << w;
memset(dp, 0, sizeof(dp));
//边界
for(int i = 0; i < r; ++i)
if(TestFirstLine(i)) dp[0][i] = 1;
for(int i = 1; i < h; ++i)
for(int j = 0; j < r; ++j)
for(int k = 0; k < r; ++k) {
if(is_ok(j, k)) dp[i][j] += dp[i-1][k];
}
return dp[h-1][r-1];
}
int main() {
while(scanf("%d%d", &w, &h) == 2 && w && h) {
printf("%lld\n", solve());
}
return 0;
}
对于uva11270这种状压dp会超时,使用轮廓线DP可将复杂度降低到w*h*(2^w),详细解法见训练指南P384
AC代码
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <cstring>
#include <utility>
#include <string>
#include <iostream>
#include <map>
#include <set>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define eps 1e-10
#define inf 0x3f3f3f3f
#define PI pair<int, int>
typedef long long LL;
const int maxn = 10 + 1;
LL dp[2][1<<maxn];
int n, m;
void update(int f, int a, int b) {
if(b & (1<<m)) dp[f][b^(1<<m)] += dp[1-f][a];
}
LL solve() {
if(n < m) swap(n, m);
memset(dp, 0, sizeof(dp));
int f = 0;
dp[0][(1<<m)-1] = 1; //边界
for(int i = 0; i < n; ++i)
for(int j = 0; j < m; ++j) {
f ^= 1;
memset(dp[f], 0, sizeof(dp[f]));
for(int k = 0; k < (1 << m); ++k) {
//不放
update(f, k, k<<1);
//横着放
if(j && !(k&1)) update(f, k, (k<<1)^3);
//竖着放
if(i && !(k&(1<<m-1))) update(f, k, (k<<1)^(1<<m)^1);
}
}
return dp[f][(1<<m)-1];
}
int main() {
while(scanf("%d%d", &n, &m) == 2) {
printf("%lld\n", solve());
}
return 0;
}
如有不当之处欢迎指出!
UVA - 11270 轮廓线DP的更多相关文章
- HDU1565 方格取数 &&uva 11270 轮廓线DP
方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- UVA 11270 轮廓线
题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33787 题意: 用1*2或2*1的长条把n*m方格铺满的方案数. ...
- UVa 11270 铺放骨牌(轮廓线DP)
https://vjudge.net/problem/UVA-11270 题意: 用1×2骨牌覆盖n×m棋牌,有多少种方法? 思路: 这道题目是典型的轮廓线DP题. 所谓轮廓线DP,就是以整行整列为状 ...
- uva 11270 - Tiling Dominoes(插头dp)
题目链接:uva 11270 - Tiling Dominoes 题目大意:用1∗2木块将给出的n∗m大小的矩阵填满的方法总数. 解题思路:插头dp的裸题,dp[i][s]表示第i块位置.而且该位置相 ...
- 轮廓线DP POJ3254 && BZOJ 1087
补了一发轮廓线DP,发现完全没有必要从右往左设置状态,自然一点: 5 6 7 8 9 1 2 3 4 如此设置轮廓线标号,转移的时候直接把当前j位改成0或者1就行了.注意多记录些信息对简化代码是很有帮 ...
- HDU4804 Campus Design 轮廓线dp
跟上面那篇轮廓线dp是一样的,但是多了两个条件,一个是在原图上可能有些点是不能放的(即障碍),所以转移的时候要多一个判断color[i][j]是不是等于1什么的,另外一个是我们可以有多的1*1的骨牌, ...
- POJ2411 Mondriaan's Dream 轮廓线dp
第一道轮廓线dp,因为不会轮廓线dp我们在南京区域赛的时候没有拿到银,可见知识点的欠缺是我薄弱的环节. 题目就是要你用1*2的多米诺骨排填充一个大小n*m(n,m<=11)的棋盘,问填满它有多少 ...
- [UOJ422][集训队作业2018]小Z的礼物——轮廓线DP+min-max容斥
题目链接: [集训队作业2018]小Z的礼物 题目要求的就是最后一个喜欢的物品的期望得到时间. 根据$min-max$容斥可以知道$E(max(S))=\sum\limits_{T\subseteq ...
- 【UOJ#422】【集训队作业2018】小Z的礼物(min-max容斥,轮廓线dp)
[UOJ#422][集训队作业2018]小Z的礼物(min-max容斥,轮廓线dp) 题面 UOJ 题解 毒瘤xzy,怎么能搬这种题当做WC模拟题QwQ 一开始开错题了,根本就不会做. 后来发现是每次 ...
随机推荐
- hibernate_xml映射exception
错误原因:在通过hibernate指示生成两个表之间的外键关系之后,一个表中引用的外键不在另一个表的参考范围里面. 解决:使之满足参考完整性 org.hibernate.TransientObject ...
- C++ concurrency in action 读随记1
翻了翻,感觉标准库支持的并发应该是kernel level 的(书里也没有明确写,不过他写了诸如"操作系统来安排""需要知道硬件支持多少线程"等等话语,所以猜测 ...
- traffic server文件目录
功能: Trafficserver的主要功能是缓存,当然你也可以用它来做纯粹的反向代理(像通常用nginx那样).通常切入一个庞大的系统的最好方式是看如何使用,使用traffic server的主要入 ...
- Linux面试题(2)
一.Linux操作系统知识 1.常见的Linux发行版本都有什么?你最擅长哪一个?它的官网网站是什么?说明你擅长哪一块? Centos,Ubunto,fedora,openSUSE,Debian等,擅 ...
- 官方新出的 Kotlin 扩赞库 KTX,到底帮你干了什么?
Kotlin KTX 2月5号的时候,Google 发布了一款 Kotlin 的扩展库,叫 Android KTX,不过现在还处于预览版的状态.它能使 Android 上的 Kotlin 代码更简洁, ...
- 使用babel转换es6编写的程序
配置文件 Babel的配置文件是.babelrc,存放在项目的根目录下.使用Babel的第一步,就是配置这个文件,这是必要的一步. 该文件用来设置转码规则和插件,基本格式如下. { "pre ...
- 新建play项目eclipsify后导入eclipse后无法debug调试
Error occurred during initialization of VMagent library failed to init: jdwpERROR: Cannot load this ...
- mkdir与mkdirs的区别
mkdir与mkdirs的区别 项目中需要在代码中读取或创建文件保存路径,用到了mkdir,查看还有个mkdirs方法,这里记录一下两者的区别. 1.关于两者的说明如下: boolean mkdir( ...
- iOS-AFNetworking封装Get(自定义HTTP Header)和Post请求及文件下载
前面提到AFNetworking是一个很强大的网络三方库,首先你需要引入AFNetworking三方库:如封装的有误还请指出,谢谢! 1.Get请求 /**Get请求 url 服务器请求地址 succ ...
- 洛谷 [P3110] 驮运
题目略带一点贪心的思想,先跑三遍最短路(边权为一,BFS比SPFA高效) 一起跑总比分开跑高效,枚举两人在何点汇合,输出最小值. #include <iostream> #include ...