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)的更多相关文章

  1. 【鸽】poj3311 Hie with the Pie[状压DP+Floyd]

    题解网上一搜一大坨的,不用复述了吧. 只是觉得网上dp方程没多大问题,但是状态的表示含义模糊.不同于正常哈密顿路径求解,状态表示应当改一下. 首先定义一次移动为从一个点经过若干个点到达另一个点,则$f ...

  2. 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点的最短路(点可重复走) ...

  3. poj 3311 Hie with the Pie 经过所有点(可重)的最短路径 floyd + 状压dp

    题目链接 题意 给定一个\(N\)个点的完全图(有向图),求从原点出发,经过所有点再回到原点的最短路径长度(可重复经过中途点). 思路 因为可多次经过同一个点,所以可用floyd先预处理出每两个点之间 ...

  4. POJ 3311 Hie with the Pie (状压DP)

    题意: 每个点都可以走多次的TSP问题:有n个点(n<=11),从点1出发,经过其他所有点至少1次,并回到原点1,使得路程最短是多少? 思路: 同HDU 5418 VICTOR AND WORL ...

  5. poj 3311 Hie with the Pie

    floyd,旅游问题每个点都要到,可重复,最后回来,dp http://poj.org/problem?id=3311 Hie with the Pie Time Limit: 2000MS   Me ...

  6. POJ 3311 Hie with the Pie(Floyd+状态压缩DP)

    题是看了这位的博客之后理解的,只不过我是又加了点简单的注释. 链接:http://blog.csdn.net/chinaczy/article/details/5890768 我还加了一些注释代码,对 ...

  7. POJ 1321 棋盘问题(DFS & 状压DP)

    用DFS写当然很简单了,8!的复杂度,16MS搞定. 在Discuss里看到有同学用状态压缩DP来写,就学习了一下,果然很精妙呀. 状态转移分两种,当前行不加棋子,和加棋子.dp[i][j]中,i代表 ...

  8. POJ:1185-炮兵阵地(状压dp入门)

    炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组 ...

  9. poj 2404 中国邮递员问题 欧拉回路判定+状压dp

    /* 状压dp 邮递员问题:求经过任意点出发经过每一条边一次并回到原点. 解法:1.如果是欧拉回路那么就是所有的边的总和. 2.一般的解法,找出所有的奇度顶点,任意两个顶点匹配,即最小完美匹配,可用状 ...

随机推荐

  1. x-forward-for详解

    转载:http://www.360doc.com/content/14/0110/17/15459414_344165975.shtml 如今利用nginx做负载均衡的实例已经很多了,针对不同的应用场 ...

  2. 使用JavaScript的history对象来实现页面前进后退(go/back/forward)。

    我们都知道JavaScript有history对象,主要是用来记录浏览器窗口的浏览记录.但是,JS脚本是不允许访问到这个记录里面的内容(隐私). 常见的用法是: history.back();//返回 ...

  3. 关于GridView的第一个item图片加载不出来问题

    首先感谢csdn里的id   大神了没  的博客 地址:http://blog.csdn.net/wenyiqingnianiii/article/details/39291667 原因在positi ...

  4. MFC中ClistCtrl的=NM_CUSTOMDRAW消息

    =NM_CUSTOMDRAW是你点击列表内部是的消息映射: 例如:我想在我删除一行列表的数据,但是删除后下一行数据继续保持高亮状态 void CChildView::OnDel() { int cou ...

  5. 【LeetCode OJ】Validate Binary Search Tree

    Problem Link: https://oj.leetcode.com/problems/validate-binary-search-tree/ We inorder-traverse the ...

  6. Mac下搭建php开发环境【转】

    Mac OS X 内置了Apache 和 PHP,这样使用起来非常方便.本文以Mac OS X 10.6.3为例.主要内容包括: 启动Apache 运行PHP 安装MySQL 使用phpMyAdmin ...

  7. TextFieldDelegate

    #import "AppDelegate.h" @interface AppDelegate ()<UITextFieldDelegate> @end @impleme ...

  8. CentOS7.1配置源

    现在网上最新的是CentOS7.1, 但是在配置国内流行的163源的时候,网上的文章大多数我这里都通不过. 错误信息大概是: One of the configured repositories fa ...

  9. c++ 顺序容器适配器

    第一次看到stack,以为它是一个和vector同等地位的容器,其实不是 官方解释:stacks are a type of container adaptor, specifically desig ...

  10. LINQ To SQL

    议程 1.LINQ To SQL概述 2.LINQ To SQL对象模型 3.LINQ To SQL查询 用到的数据库 SQL Server 2005,数据库名为Test. 两张表,分别为Studen ...