POJ 1185 炮兵阵地(状压DP入门)
2016-03-19 10:28
495 查看
http://poj.org/problem?id=1185
状压DP:
状压DP:
#include<iostream> #include<cstring> #include<algorithm> using namespace std; int dp[105][100][100]; int ma[105],st[105]; int ok(int x) { return (x&(x<<1))+(x&(x<<2)); } int num(int x) { int sum=0; while (x) { if (x&1) sum++; x>>=1; } return sum; } int main() { int n,m,i,j,k,l; char c; cin>>n>>m; memset(dp,0,sizeof(dp)); memset(ma,0,sizeof(ma)); for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { cin>>c; if (c=='H') ma[i]+=1<<(j-1); } } int cut=0; for (i=0;i<(1<<m);i++) { if (!ok(i)) st[cut++]=i; } for (i=0;i<cut;i++) { if (!(ma[1]&st[i])) dp[1][i][0]=num(st[i]); } for (i=2;i<=n;i++) { for (j=0;j<cut;j++) { if (ma[i]&st[j]) continue; for (k=0;k<cut;k++) { if (ma[i-1]&st[k]) continue; if (st[k]&st[j]) continue; for (l=0;l<cut;l++) { if (ma[i-2]&st[l]) continue; if (st[l]&st[j]) continue; if (st[k]&st[l]) continue; dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][l]+num(st[j])); } } } } int ans=0; for (i=0;i<cut;i++) { for (j=0;j<cut;j++) ans=max(ans,dp [i][j]); } cout<<ans<<endl; }
相关文章推荐
- AOP
- 在ScrollView下实现无论怎么滚动,toolbar始终在呈现在手机屏幕的最上方
- swift中实现description
- 北京Uber优步司机奖励政策(3月19日)
- ASMC(异步静态存储控制器)
- Leetcode #17 Letter Combinations of a Phone Number Z9键盘字母组合解题小节
- OpenGL ES 2.0 shader开发
- hdu 4003 Find Metal Mineral(树形dp+分组背包)
- iOS 推送,证书申请,本地推送
- 一点一滴分析LinkIt™ Smart 7688 编译环境
- HIVE的简介
- 简单聊天界面
- 算法学习之最小生成树prim算法
- linux中ssh登录Permanently added (RSA) to the list of known hosts问题解决
- POJ 1088
- 打字小游戏
- Ajax与PHP【1.4代码】
- IIImuSnoitanibmoC.216
- [剑指Offer]第一个只出现一次的字符
- 离散化+线段树