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.一般的解法,找出所有的奇度顶点,任意两个顶点匹配,即最小完美匹配,可用状 ...
随机推荐
- java第一天学习作业及答案
作业一 一.选择题 1.选出在java中有效的注释声明(AD)(选两项) A.//这是注释 B.*/这是注释*/ C./这是注释 D./*这是注释*/ 2.在控制台运行一个java程序,使用的命名正确 ...
- 转:AJAX中xhr对象详解
XJAX ,并不是一种新技术的诞生.它实际上代表的是几项技术按一定的方式组合在一在同共的协作中发挥各自的作用. 它包括: 使用XHTML和CSS标准化呈现: 使用DOM实现动态显示和交互: 使用XML ...
- IOS自定义日历控件的简单实现(附思想及过程)
因为程序要求要插入一个日历控件,该空间的要求是从当天开始及以后的六个月内的日历,上网查资料基本上都说只要获取两个条件(当月第一天周几和本月一共有多少天)就可以实现一个简单的日历,剩下的靠自己的简单逻辑 ...
- Ionic2 rc2 Events 跨界面调用的使用方法及问题解决
Events:事件注册 在任意一界面注册事件之后可在任意界面根据事件名称进行调用. 首先看一下官方文档的调用方式 import { Events } from 'ionic-angular'; co ...
- SSH中,使用Filter拦截直接访问JSP页面!
话不多说,直接上代码 创建一个Filter类 package com.weibo.util; import java.io.IOException; import javax.servlet.Filt ...
- C#正则表达式匹配字符串
正则表达式可以快速判断所给字符串是否某种指定格式.这里将一些常用的方法封装进一个字符串工具类中. public static class StringTool { /// <summary> ...
- softwareTesting_work2_question2
work2类 package com.Phantom; import java.util.Scanner; import javax.print.DocFlavor.INPUT_STREAM; pub ...
- Thinkpad T420 指纹开机 win10 解决方案
以前没感觉笔记本上的指纹有什么用,后来无意看到了指纹能开机.便尝试把这个功能给用起来.果然麻烦了些. 1.官网上没有win10的指纹应用软件. 下载了win8的版本,安装后没有问题,可以登录win10 ...
- Photoshop制作的海报修改~
经过几天的征求意见,感觉还是要重新制作,于是把颜色删减了不少 . 这次运用了蒙版和渐变,但感觉效果不太好.再改.. 后来觉得给人的单身感有点少.. 不知道感觉如何,但自己觉得比以前好看..
- declaration is incompatible with "__nounwind __interwork __softfp unsigned long __get_PSP(void)" IAR 编译报故障
原因是以前的CMSIS CORTEX-CM0 文件太老了. 使用新文件就可以.