POJ 3311 Hie with the Pie (状压DP)
dp[i][j][k] i代表此层用的状态序号 j上一层用的状态序号 k是层数&1(滚动数组)
标准流程 先预处理出所有合法数据存在status里 然后独立处理第一层 然后根据前一层的max推下一层
由于最多只有60多种状态 所以这其实就是个大暴力 其实还不慢
关于为什么要反义输入地图 因为我懒得写一个地图匹配状态函数了 所以直接让地图反义匹配状态
应该算是比较简单的状压DP
然而我还是写残了WA了两次orz
#include <iostream>
#include <string>
#include <cstring>
#include <vector>
#include <algorithm>
using namespace std; int size, status[], num[];
int n, m, maze[], dp[][][]; inline bool ok(int a){
return !((a & (a >> )) || (a & a >> ));
} inline bool fit(int a, int b){
return !(a & b);
} void init(){
size = ;
memset(num, , sizeof num);
int top = << m;
for(int i = ; i < top; ++i){
if(ok(i)){
status[size] = i;
int tmp = i;
while(tmp){
if(tmp & ) num[size]++;
tmp >>= ;
}
++size;
//cout << i << ends << num[size] << endl;
}
}
} int main()
{
while(cin >> n >> m){
init(); for(int i = ; i < n; ++i){
string tmp;
cin >> tmp;
for(int j = ; j < m; ++j){
maze[i] <<= ;
//地图要反义输入
maze[i] += (tmp[j] == 'H');
}
//cout << maze[i] << endl;
} memset(dp, , sizeof dp);
for(int i = ; i < size; ++i){
if(fit(status[i], maze[])){
dp[i][][] = num[i];
//cout << status[i] << ends << num[i] << endl;
}
}
for(int i = ; i < n; ++i){
for(int j = ; j < size; ++j){
if(fit(maze[i], status[j])){
for(int k = ; k < size; ++k){
if(fit(status[j], status[k])){
int maxx = ;
for(int l = ; l < size; ++l){
if(fit(status[j], status[l])){
maxx = max(maxx, dp[k][l][!(i&)]);
}
}
dp[j][k][i&] = max(dp[j][k][i&], maxx + num[j]);
}
}
}
}
} int ans = ;
for(int i = ; i < size; ++i){
for(int j = ; j < size; ++j){
ans = max(ans, dp[i][j][!(n&)]);
}
}
cout << ans << endl;
}
return ;
}
POJ 3311 Hie with the Pie (状压DP)的更多相关文章
- 【鸽】poj3311 Hie with the Pie[状压DP+Floyd]
题解网上一搜一大坨的,不用复述了吧. 只是觉得网上dp方程没多大问题,但是状态的表示含义模糊.不同于正常哈密顿路径求解,状态表示应当改一下. 首先定义一次移动为从一个点经过若干个点到达另一个点,则$f ...
- East Central North America 2006 Hie with the Pie /// 状压dp oj22470
题目大意: 输入n,有n个地方(1~n)需要送pizza pizza点为0点 接下来n+1行每行n+1个值 表示 i 到 j 的路径长度 输出从0点到各点送pizza最后回到0点的最短路(点可重复走) ...
- poj 3311 Hie with the Pie 经过所有点(可重)的最短路径 floyd + 状压dp
题目链接 题意 给定一个\(N\)个点的完全图(有向图),求从原点出发,经过所有点再回到原点的最短路径长度(可重复经过中途点). 思路 因为可多次经过同一个点,所以可用floyd先预处理出每两个点之间 ...
- POJ 3311 Hie with the Pie (状压DP)
题意: 每个点都可以走多次的TSP问题:有n个点(n<=11),从点1出发,经过其他所有点至少1次,并回到原点1,使得路程最短是多少? 思路: 同HDU 5418 VICTOR AND WORL ...
- poj 3311 Hie with the Pie
floyd,旅游问题每个点都要到,可重复,最后回来,dp http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS Me ...
- POJ 3311 Hie with the Pie(Floyd+状态压缩DP)
题是看了这位的博客之后理解的,只不过我是又加了点简单的注释. 链接:http://blog.csdn.net/chinaczy/article/details/5890768 我还加了一些注释代码,对 ...
- POJ 1321 棋盘问题(DFS & 状压DP)
用DFS写当然很简单了,8!的复杂度,16MS搞定. 在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀. 状态转移分两种,当前行不加棋子,和加棋子.dp[i][j]中,i代表 ...
- POJ:1185-炮兵阵地(状压dp入门)
炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组 ...
- poj 2404 中国邮递员问题 欧拉回路判定+状压dp
/* 状压dp 邮递员问题:求经过任意点出发经过每一条边一次并回到原点. 解法:1.如果是欧拉回路那么就是所有的边的总和. 2.一般的解法,找出所有的奇度顶点,任意两个顶点匹配,即最小完美匹配,可用状 ...
随机推荐
- js操作dom---创建一个域来输出调试信息
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/ ...
- A Brief Review of Supervised Learning
There are a number of algorithms that are typically used for system identification, adaptive control ...
- GridView在ScrollView中实现在家更多
这个本身会有bug 应该在滑动监听中作出判断的 <?xml version="1.0" encoding="utf-8"?><Relativ ...
- AngularJs angular.identity和angular.noop详解
angular.identity 函数返回本身的第一个参数.这个函数一般用于函数风格. ----------以上是官网对该接口的说明,只能说这个文档写得也太二,让人完全看不懂.要理解它的用途,可直接看 ...
- windows核心编程---第八章 使用内核对象进行线程同步
使用内核对象进行线程同步. 前面我们介绍了用户模式下线程同步的几种方式.在用户模式下进行线程同步的最大好处就是速度非常快.因此当需要使用线程同步时用户模式下的线程同步是首选. 但是用户模式下的线程同步 ...
- BZOJ 1584 DP
显然序列不能超过sqrt(n),因为最差情况是每个都独立答案为n #include <iostream> #include <cstring> #include <cst ...
- 关于angularjs中ajax请求php接口参数个是转换的问题
mainApp.config(function($httpProvider){ $httpProvider.defaults.transformRequest = function(obj){ var ...
- BackTrack5-r3任务栏显示网络图标及自定义DNS
任务栏显示网络连接图标:安装NM工具,在BT终端中执行:apt-get install network-manager按y继续执行,显示:ldconfig deferred processing no ...
- JUnit4参数的使用
用JUnit4进行参数化测试 参数化测试是一个JUnit 3不具备的功能. 基本使用方法 @RunWith 当类被@RunWith注解修饰,或者类继承了一个被该注解修饰的类,JUnit将会使用这个注解 ...
- ajax的status为201依然触发jquery的error事件的问题
昨天在调试一个ajax的时候发现,即使status是201,仍然会触发jquery的error事件.statusText是"parseerror". 通过在stackoverflo ...