`
xxx0624
  • 浏览: 31676 次
文章分类
社区版块
存档分类
最新评论

POJ1185+状态压缩DP

 
阅读更多

经典的状态压缩DP。

dp[i][j][k] = max( dp,dp[i-1][k][k2] );

k是前一行的状态,k2是前二行的状态。

/*
dp[i][j][k] = max( dp,dp[i-1][k][k2] );
k是前一行的状态,k2是前二行的状态。
*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
#include<iostream>
#include<queue>
#include<stack>
#include<math.h>
#include<map>
using namespace std;
const int maxn = 105;
const int maxm = 12;
const int N = 65;
int mat[ maxn ],mm[ maxn ][ maxm ];
int dp[ maxn ][ N ][ N ];
int state[ maxn ],ones_state[ maxn ];

int GetSum( int x ){
	int sum = 0;
	while( x ){
		if( x&1 )
			sum++;
		x>>=1;
	}
	return sum;
}		
	
int init_state( int n,int m ){
	int M = (1<<m);
	int cnt =0;
	memset( state,0,sizeof( state ) );
	memset( ones_state,0,sizeof( ones_state ) );
	for( int i=0;i<M;i++ ){
		if( (i&(i<<1))==0&&(i&(i<<2))==0&&(i&(i>>1))==0&&(i&(i>>2))==0 ){
			state[ cnt ] = i;
			ones_state[ cnt++ ] = GetSum( i );
		}
	}
	//printf("cnt=%d\n",cnt);
	return cnt;
}

void DP( int cnt,int n,int m ){
	memset( dp,-1,sizeof( dp ) );
	for( int i=0;i<cnt;i++ ){
		if(( mat[0]&state[i] )==0)
			dp[ 0 ][ i ][ 0 ] = ones_state[ i ];
	}
	for( int i=1;i<n;i++ ){
		for( int j=0;j<cnt;j++ ){
			if( (mat[i]&state[j])==0 ){
				for( int k=0;k<cnt;k++ ){
					if( (state[j]&state[k])==0 ){
						for( int k2=0;k2<cnt;k2++ ){
							if( dp[i-1][k][k2]==-1 ) continue;
							if( (state[j]&state[k2])==0&&(state[k]&state[k2])==0 ){
								dp[i][j][k] = max( dp[i][j][k],dp[i-1][k][k2]+ones_state[j] );
							}
						}
					}
				}
			}
		}
	}
	return ;
}

int main(){
	int n,m;
	while( scanf("%d%d",&n,&m)==2 ){
		int cnt = init_state( n,m );
		char s[ maxm ];
		for( int i=0;i<n;i++ ){
			scanf("%s",s);
			for( int j=0;j<m;j++ ){
				if( s[j]=='P' )
					mm[i][j] = 1;
				else
					mm[i][j] = 0;
			}
		}
		memset( mat,0,sizeof( mat ) );
		for( int i=0;i<n;i++ ){
			for( int j=0;j<m;j++ ){
				if( mm[i][j]==0 )
					mat[i] |= (1<<j);
			}
		}
		DP( cnt,n,m );
		int ans = 0;
		for( int i=0;i<cnt;i++ ){
			for( int j=0;j<cnt;j++ ){
				ans = max( ans,dp[n-1][i][j] );
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}



分享到:
评论

相关推荐

    状态压缩DP

    ### 状态压缩动态规划知识点详解 #### 一、状态压缩动态规划概述 状态压缩动态规划是一种结合了状态压缩技术和动态规划思想的算法方法。它主要用于解决具有特定结构的问题,特别是那些涉及状态空间较大但可以通过...

    状态压缩DP.pdf

    状态压缩动态规划(State Compression Dynamic Programming, 简称状态压缩DP)是一种高效的解决问题的方法,特别适用于解决那些状态数量非常多、但存在很多冗余状态的问题。状态压缩DP的核心思想在于如何有效地表示...

    POJ3411-Paid Roads【class】

    标题中的"POJ3411-Paid Roads【class】"指的是一个编程竞赛问题,源自北京大学的在线评测系统POJ(Problem Online Judge)。这个题目可能涉及到道路付费的问题,需要通过编程来解决。"class"在这里可能指的是在解决...

    POJ 2411 Mondriaan's Dream详细解题报告

    为了表示这些状态,引入了“状态压缩”的概念。对于每一种状态,还需记录它可以产生哪些下一层的状态。 ##### 3.2 动态规划 (DP) 动态规划被用来计算最终的答案。通过DFS得到的状态可以作为DP的转移条件。DP的基本...

    poj dp总结,动态规划分类

    - **1733**:“Parity game”——涉及状态压缩和位运算的技巧。 3. **高级动态规划** - **1015, 1635, 1636, 1671, 1682, 1692, 1704, 1717, 1722, 1726, 1732, 1770, 1821, 1853, 1949, 2019, 2127, 2176, 2228,...

    POJ1015-Jury Compromise【动态规划DP】

    【压缩包子文件的文件名称列表】中的 "POJ1015-Jury Compromise.cpp" 是C++语言编写的源代码文件,里面包含了对题目"Jury Compromise"的解决方案。".cpp" 文件通常包含函数定义、数据结构、输入输出处理以及动态规划...

    poj_dp分类

    **解题思路**:通过位运算等技巧实现状态压缩。 #### 10. 2138 **题目描述**:可能是较复杂的动态规划题目。 **解题思路**:根据题目特点设计状态转移方程。 ### 特殊分类 #### 1. 1019,1037,1080,1112,1141,1170...

    POJ3080-Blue Jeans

    【压缩包子文件的文件名称列表】中,"POJ3080-Blue Jeans.cpp" 是提交给POJ平台的AC代码,可能包含了上述的动态规划解法,使用C++语言实现。"POJ3080-Blue Jeans.doc" 可能是解题报告文档,详细解释了解题过程和思路...

    状压dp经典问题及代码

    POJ3254是一个关于放牛的问题,而POJ1185是关于如何在不互相攻击的前提下放置最大数量的炮兵。这两个问题都涉及到状态压缩技术,并且都是使用位运算来表示状态和实现状态转移。 总结来说,状态压缩动态规划主要解决...

    dp状态压缩

    帮助像我一样的oi菜鸟更好更快的理解标程,在oi界能够大显身手

    POJ1321-Chess Problem

    7. **状态压缩**:对于大棋盘,可以用位运算进行状态压缩,以节省空间。 由于没有具体的题目描述,以上只是根据一般编程竞赛经验的推测。实际的解题方法需要参考"POJ1321-Chess Problem.doc"提供的详细信息。在解决...

    POJ题目简单分类(ACM)

    - **表格型DP**:如poj3267,通过状态转移矩阵求解问题。 6. **数学**: - **组合数学**:包括计数原理、排列组合以及递推关系,如poj3252。 - **数论**:涵盖素数、整除、进制和同余模运算,如poj2635。 - **...

    poj1038--Bugs.rar_Bugs_poj 1038 _poj10_poj1038

    标题中的“poj1038--Bugs.rar”是一个关于解决编程竞赛问题的压缩文件,其中包含了对“Bugs”问题的解答。POJ(Problemset Online Judge)是一个在线编程竞赛平台,它提供了一系列的问题供参赛者解决,旨在锻炼和...

    acm新手刷题攻略之poj

    - 状态压缩DP用于处理状态空间较大的问题。 3. **后缀数组** - 推荐题目:[poj1195](https://vjudge.net/problem/POJ-1195)、[poj3321](https://vjudge.net/problem/POJ-3321) - 后缀数组可以高效地解决字符串...

    经典动态规划合集_牛人 树形,压缩 老题

    3.徐持衡《浅谈几类...基于连通性状态压缩的动态规划问题 对一些DP题目的小结 树型动态规划 树型动态规划和状态压缩动态规划 算法导论第15章-动态规划 最长公共子序列和字符串相似度 最大矩阵连乘次数(最小连乘变形)

    ACM程序模板 from poj

    在提供的代码片段中,实现了一个状态压缩DP来解决POJ 1038问题。该问题的核心是找到一种方式覆盖草地上的所有格子,使得没有两块草地相邻。代码中使用了`dp`数组来存储状态转移的结果,其中`dp[y][w]`表示当前覆盖...

    poj题目分类

    5. 哈夫曼树:编码压缩,如POJ3253。 6. 堆:优先队列的实现,如最小堆和最大堆。 7. Trie树:字符串搜索和存储,包括静态和动态构建,如POJ2513。 四、搜索 1. 深度优先搜索(DFS):如POJ2488、POJ3083等,常用于...

    POJ ACM 1015 Jury Compromise

    1. 状态定义:设dp[i][mask]表示前i个裁判中,选择mask表示的裁判子集所能得到的最大共识裁判数。 2. 状态转移:对于第i个裁判,有两种情况:包含该裁判和不包含该裁判。若包含,则需要找到与前i-1个裁判有共识的...

    代码生成器1

    代码生成器是一种软件工具,它能够自动生成编程代码,帮助开发者快速构建应用程序或者解决特定的编程任务。在软件开发过程中,代码生成器可以大大提高效率,减少手动编写重复代码的工作量,使得开发人员能够专注于更...

    ACM-PKU-DP.zip_源码

    压缩包子文件的文件名称列表:2353_DP.cpp、1458_DP.cpp、1157_DP.cpp,这些是C++源代码文件,每个文件对应一个具体的动态规划问题。根据POJ的编号规则,这些数字很可能分别代表了对应问题在POJ网站上的唯一ID。 接...

Global site tag (gtag.js) - Google Analytics