POJ 1185 经典状压dp
做了很久的题 有注释
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- #include<map>
- #include<math.h>
- using namespace std;
- int dp[107][107][107];///二维记录上一次 三维记录此次
- ///dp[i][k][j]=max(dp[i][k][j],dp[i-1][t][k])+num[j]; t为枚举数且满足与 k j 的条件
- ///初始化can num数组减少时间
- ///如果不使用can数组来记录 memset都会超时
- int can[107];
- int num[107];
- int n,m;
- int c[107];
- char s[107];
- bool ok(int x)
- {
- if(x&(x<<1))
- return false;
- if(x&(x<<2))
- return false;
- return true;
- }
- int main(){
- while(~scanf("%d%d",&n,&m))
- {
- for(int i=0;i<n;i++)
- {
- scanf("%s",s);
- c[i]=0;
- for(int k=0;k<m;k++)
- {
- if(s[k]=='H')
- c[i]+=(1<<k);
- }
- }
- int w=0;
- memset(dp,-1,sizeof(dp));
- for(int i=0;i<(1<<m);i++)
- {
- if(ok(i))
- {
- can[w]=i;
- int x=can[w];
- num[w]=0;
- while(x>0)
- {
- if(x&1)num[w]++;
- x>>=1;
- }
- w++;
- }
- }
- for(int i=0;i<w;i++)
- {
- if(!(can[i]&c[0])) ///得满足条件才能放
- dp[0][0][i]=num[i];
- }
- for(int i=1;i<n;i++)
- {
- for(int j=0;j<w;j++)
- {
- if(c[i]&can[j])
- continue;
- for(int k=0;k<w;k++)
- {
- if(can[j]&can[k])
- continue;
- for(int t=0;t<w;t++)
- {
- if(can[j]&can[t]||can[k]&can[t])
- continue;
- if(dp[i-1][t][k]==-1) ///如果上一行等于-1说明不满足条件
- continue;
- dp[i][k][j]=max(dp[i][k][j],dp[i-1][t][k]+num[j]);
- }
- }
- }
- }
- int ans=0;
- for(int k=0;k<n;k++)
- for(int i=0;i<w;i++)
- for(int j=0;j<w;j++)
- {
- ans=max(ans,dp[k][i][j]);
- }
- printf("%d\n",ans);
- }
- }
POJ 1185 经典状压dp的更多相关文章
- POJ 3254 & POJ 1185(状压DP入门)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 16773 Accepted: 8860 Desc ...
- poj 1185 (状压dp)
Problem 炮兵阵地 题目大意 给你一张n*m的地图,一些地区是空地,一些地区是障碍. 可以在空地上布置炮兵部队,炮兵部队的攻击范围为上下左右各两格. 询问最多可以布置多少个炮兵部队,且互不伤害. ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- POJ 3254 简单状压DP
没什么可说的,入门级状压DP.直接撸掉 #include <iostream> #include <cstring> #include <cstdlib> #inc ...
- poj -1185 炮兵阵地 (经典状压dp)
http://poj.org/problem?id=1185 参考博客:http://poj.org/problem?id=1185 大神博客已经讲的很清楚了,注意存状态的时候是从1开始的,所以初始化 ...
- Corn Fields POJ - 3254 (状压dp)
题目链接: Corn Fields POJ - 3254 题目大意:给你一个n*m的矩阵,矩阵的元素只包括0和1,0代表当前的位置不能放置人,1代表当前的位置可以放人,当你决定放人的时候,这个人的四 ...
- hoj 2662 经典状压dp // MyFirst 状压dp
题目链接:http://acm.hit.edu.cn/hoj/problem/view?id=2662 1.引言:用dp解决一个问题的时候很重要的一环就是状态的表示,一般来说,一个数组即可保存状态. ...
- HDU 1074 Doing Homework(经典状压dp)
题目链接 Doing Homework Ignatius has just come back school from the 30th ACM/ICPC. Now he has a ...
- 【BZOJ1087】 [SCOI2005]互不侵犯King 状压DP
经典状压DP. f[i][j][k]=sum(f[i-1][j-cnt[k]][k]); cnt[i]放置情况为i时的国王数量 前I行放置情况为k时国王数量为J #include <iostre ...
随机推荐
- javascript类的类比详解-大白话版
转载请注明出处:水车 如果有误,还望指出,谢谢 -----------------正文分割线---------------------- 类:类太抽象,要想弄明白就该用现实的东西来类比 在我看来类就是 ...
- intellij 2016注册
第一种方法: http://idea.qinxi1992.cn http://idea.imsxm.com/ http://107.191.37.186:11688
- 最新php环境搭建
参考文章:http://jingyan.baidu.com/article/29697b912f6539ab20de3cf8.html
- oracle的启动过程(各个模式启动)
启动模式详解 1.NoMount 模式(启动实例不加载数据库) 命令:startup nomount 讲解:这种启动模式只会创建实例,并不加载数据库,Oracle仅为实例创建各种内存结构和服务进程,不 ...
- vijos 1028 LIS *
链接:点我 #include<cstdio> #include<iostream> #include<algorithm> #include<cstring& ...
- Inno setup 简单打包教程
转自:http://blog.csdn.net/ruifangcui7758/article/details/6662646 前段时间关注了VC6.0自带的Installshield打包的使用方法,感 ...
- TextView属性大全
今天研究了TextView一天了,发现网上有一篇讲TextView属性的,非常全,收藏一下先. 发现TextView有一个比较大的问题,就是文字排版的问题,遇到数字,字母,符号等就会有问题,目前还没有 ...
- ARP缓存记录种类动态条目和静态条目
ARP缓存记录种类动态条目和静态条目 为使广播量最小,ARP维护IP地址到MAC地址映射的缓存以便将来使用.根据缓存的有效期时间,ARP缓存中包含动态和静态条目本文选自ARP协议全面实战手册. 这里首 ...
- DOM对象和JQuery对象
1.JS对象转化为Jquery对象 Var p=document.getElementById(“p”); Var $obj=$(p); 2.Jquery对象转换为JS对象 Var $bh=$(“#i ...
- ConversionPattern 解析
Sample <param name="ConversionPattern" value="%d [%t] %-5p %c [%x] %X{auth} - Line ...