poj 1185 状态压缩dp
2015-11-29 22:52
399 查看
题目链接:http://poj.org/problem?id=1185
第i行的状态由第I-1行和第i-2行决定
dp[i][j][k] = max(dp[i][j][k],dp[i-1][k][p]+cou[j]);
初始化第i=0行就够了,因为不会访问i-2
第i行的状态由第I-1行和第i-2行决定
dp[i][j][k] = max(dp[i][j][k],dp[i-1][k][p]+cou[j]);
初始化第i=0行就够了,因为不会访问i-2
#include <cstdio>//改成c++就过原来用c的,wal
<span style="font-family: Arial, Helvetica, sans-serif;">#include <cstring></span>
int n,m; int sta[60],cou[100]; //60是因为满足题目条件的,即相隔2个单位的,同时小于1<<10的,刚好只有60个,可以自己打打看, int dp[110][60][60]; int map[110]; char str[12]; int max(int a,int b) { if(a > b) return a; return b; } int main() { int i,j,k,p; int sp,tmp; while(~scanf("%d %d",&n,&m)) { memset(map,0,sizeof(map)); memset(dp,-1,sizeof(dp)); memset(cou,0,sizeof(cou)); for(i = 0; i < n; i++) { scanf("%s",str); for(j = 0; j < m; j++) { if(str[j] == 'H') map[i]+=(1<<j); } } sp = 0; tmp = (1<<m); for(i = 0; i < tmp; i++) { if(!(i&(i<<2)) && !(i&(i<<1))) { p = i; while(p) { cou[sp]++; p&=(p-1); } sta[sp++] = i; } } for(i = 0; i < sp; i++) { if(!(map[0]&sta[i])) { dp[0][i][0] = cou[i]; } } for(i = 1; i < n; i++) { for(j = 0; j < sp; j++) { if(!(map[i]&sta[j])) { for(k = 0; k < sp; k++) { if(!(map[i-1]&sta[k]) && !(sta[j]&sta[k])) { for(p = 0; p < sp; p++) { if(!(sta[p]&sta[j]) && !(sta[p]&sta[k]) && dp[i-1][k][p]!=-1) { dp[i][j][k] = max(dp[i][j][k],dp[i-1][k][p]+cou[j]); } } } } } } } tmp = 0; for(i = 0; i < n; i++) { for(j = 0; j < sp; j++) { for(k = 0; k < sp; k++) { tmp = max(tmp,dp[i][j][k]); } } } printf("%d\n",tmp); } return 0; }
相关文章推荐
- CPP 6th 读书笔记——类(1)
- java基础之序列化
- 《需求工程——软件建模与分析》阅读笔记之三
- 《leetCode》:Sort Colors
- object中几个有趣的方法!
- 【风马一族_Android】Android 前端内容
- [BZOJ1858] [Scoi2010]序列操作
- Ansible用于网络设备管理 part 2 对Jinja2 YAML 和 module的理解
- 缘起爱莲:我要的,现在就要!
- 学习笔记之 Block代码块
- codeigniter是如何实现钩子机制的?
- Android AdapterView View的复用机制分析
- linux-文件系统管理02-centos7-xfs文件系统
- 并查集原理详解
- 《实时控制软件设计》第一次阅读笔记
- process.tar.gz
- 恢复Ext3下被删除的文件(转)
- 应试教育的死穴,恰在于堵死了孩子“犯错”的空间?
- Tomcat(8005,8080,8009)端口占用问题常见原因及解决方法
- HDFS的namenode和datanode