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

HDU4539+状态压缩DP

 
阅读更多

状态压缩DP

对于某一行的状态可以由前面的两行推出。

即:dp[ i ][ j ][ k ] = max( dp[ i ][ j ][ k ] , dp[ i-1 ][ k ] [ k2 ] + ones[ j ] );

其中i-1表示前1行,k2是前2行的状态。

/*
题意:n行m列的矩阵,1表示可以放东西,0表示不可以。曼哈顿距离为2的两个位置最多只能有一个位置放东西。
问最多放多少个东西。
*/
#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 = 170;
int mat[ maxn ];
int dp[ maxn ][ N ][ N ];//
int state[ N ];
int ones_state[ N ];
int Count_ones( int x ){
	int cnt = 0;
	while( x ){
		if( x&1 )
			cnt++;
		x>>=1;
	}
	return cnt;
}	
int init( int n,int m ){
	memset( state,0,sizeof( state ) );
	memset( ones_state,0,sizeof( state ) );
	int M = 1<<m;
	int cnt = 0;
	for( int i=0;i<M;i++ ){
		if( (i&(i<<2))==0 ){
			state[ cnt ] = i;
			ones_state[ cnt ] = Count_ones( i );
			cnt++;
		}
	}
	//printf("cnt=%d\n",cnt);最多169种状态!!
	return cnt;
}
void DP( int cnt,int n,int m ){
	memset( dp,-1,sizeof( dp ) );
		for( int i=0;i<cnt;i++ ){
			if( (state[i]&mat[0])==0 )
				dp[0][i][0] = ones_state[ i ];
		}//初始化
	for( int i=1;i<n;i++ ){
		for( int j=0;j<cnt;j++ ){
			if( (state[j]&mat[i])==0 ){//
				for( int k=0;k<cnt;k++ ){
					if( (state[j]&(state[k]<<1))==0&&(state[j]&(state[k]>>1))==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]>>1))==0&&(state[k]&(state[k2]<<1))==0 )
								dp[ i ][ j ][ k ] = max( dp[i][j][k],dp[i-1][k][k2]+ones_state[j] );
						}
					}
				}
			}
		}
	}
}
int main(){
	int n,m;
	while( scanf("%d%d",&n,&m)==2 ){
		int cnt = init( n,m );
		memset( mat,0,sizeof( mat ) );
		int tmp;
		for( int i=0;i<n;i++ ){
			for( int j=0;j<m;j++ ){
				scanf("%d",&tmp);
				if( tmp==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;
}


分享到:
评论

相关推荐

    hdu 3341(ac自动机+状态压缩)

    hdu 3341(ac自动机+状态压缩) 题意:容易理解... 思路:首先一开始容易想到要用到dp,开设一个dp[41][41][41][41][501]的数组来解决,但是明显内存已经超出范围了,于是就想如何减少内存呢?只要知道A、T、C、G其中...

    hdu 300+ AC 代码

    4. **动态规划(DP)**:动态规划是一种解决问题的系统方法,常用于优化问题,通过将大问题分解为小问题并存储中间结果来避免重复计算。在编程竞赛中,动态规划常用于解决背包问题、最长公共子序列、最短路径等问题...

    HDU DP动态规划

    【标题】"HDU DP动态规划"涉及到的是在算法领域中的动态规划(Dynamic Programming,简称DP)技术,这是解决复杂问题的一种高效方法,尤其适用于有重叠子问题和最优子结构的问题。动态规划通常用于优化多阶段决策...

    HDUc++上机测试真题(错题汇集1

    常量对象只能调用常量成员函数,这些函数通常用`const`修饰,表示它们不会修改对象的状态。指针可以是常量,也可以指向常量,这在内存管理中很重要。多维数组在内存中连续存储,初始化时可以指定初值或使用默认构造...

    HDU刷题地图+精选详细笔记

    本人准备2020年保研机试时刷的题目(虽然最后机试取消了,...来自某中流985,在HDU和vjudge平台上大概刷了400道。本文件地图(excel表格)包含了绝大部分我刷过的题目,笔记中具有思路、代码、总结和心得。 大佬勿入!

    HDU+2000-2099+解题报告

    2. **动态规划**:这类问题通常需要找到一种状态转移方程,通过递推或自底向上的方法求解。例如背包问题、最长公共子序列、矩阵链乘法等。 3. **图论**:包括最短路径算法(Dijkstra、Floyd-Warshall、Bellman-Ford...

    HDU+2000-2099+解题报告.zip

    《杭电OnlineJudge 2000-2099解题报告》是针对杭州电子科技大学(HDU)在线评测系统(OnlineJudge)中2000至2099题目的详细解答集锦,主要涵盖了算法分析、编程技巧以及问题解决策略等内容。这份解题报告以CHM...

    HDU DP 题集

    动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,...

    hdu+acm课件

    最后,"HDU+ACM课件"可能是一个综合性的课件集合,涵盖了ACM竞赛的各种主题,包括数据结构、算法、问题解决策略等。这是一份全面的学习资料,对于系统性地学习ACM知识非常有价值。 通过学习这些文件,你可以深入...

    HDU DP题解

    HDU上DP大集合,里面包括题,题解,代码,对DP入门者很实用,对DP老手也是有很大的提高

    ACM HDU题目分类

    DP(Dynamic Programming,动态规划)是一种非常重要的算法思想,在 ACM HDU 题目分类中,DP 问题占据了很大的比例。例如,1003 DP 经典问题,最大连续子段和;1024 经典 DP,最大 M 子段和;1025 经典 DP,最长递增...

    hdu 1257 最低拦截系统 lis

    - **状态转移方程**:`dp[i] = max(dp[j] + 1)`,其中`j 并且`a[j] [i]`,即当前元素`a[i]`能作为递增子序列的末尾时,其最长递增子序列的长度为之前以`a[j]`结尾的最长递增子序列长度加1。 - **初始化**:对于每个...

    DP.rar_DP_hdu_动态规划_动态规划 C++

    标题中的“DP.rar”表明这是一个关于动态规划的资料压缩包,而“DP_hdu”暗示了这些题目可能来自杭州电子科技大学(HDU)的在线编程平台。动态规划通常用于解决那些可以通过子问题的最优解来构建原问题最优解的问题...

    HDU_2010.rar_hdu 2010_hdu 20_hdu acm20

    【标题】"HDU_2010.rar"是一个压缩包文件,其中包含了与"HDU 2010"相关的资源,特别是针对"HDU ACM20"比赛的编程题目。"hdu 2010"和"hdu 20"可能是该比赛的不同简称或分类,而"hdu acm20"可能指的是该赛事的第20届...

    hdu.rar_hdu

    HDU(杭州电子科技大学在线评测系统)是一个深受程序员喜爱的在线编程练习平台,它提供了丰富的算法题目供用户挑战,帮助他们提升编程技能和算法理解能力。"hdu.rar_hdu"这个压缩包文件很可能是某位程序员整理的他在...

    hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj

    【标题】"hdu.rar_HDU 1089.cpp_OJ题求和_hdu_horsekw5_杭电obj" 提供的信息是关于一个压缩文件,其中包含了一个名为 "HDU 1089.cpp" 的源代码文件,这个文件是为了解决杭州电子科技大学(Hangzhou Dianzi ...

    ACM hdu 线段树题目+源代码

    为了解决这个问题,我们可以使用线段树来维护内存单元的状态。每个节点对应一个内存单元,我们可以使用懒惰标记来记录该节点是否被分配。 这样,在 Reset 操作时,我们只需要更新所有节点的懒惰标记为 0。New 操作...

    HDU题目java实现

    【标题】"HDU题目java实现"所涉及的知识点主要集中在使用Java编程语言解决杭州电子科技大学(HDU)在线评测系统中的算法问题。HDU是一个知名的在线编程竞赛平台,它提供了大量的算法题目供参赛者练习和提交解决方案...

    acmhdu1005

    hdu 1005.比较简单的一道题,有兴趣的可以看看。

    hdu动态规划算法集锦

    根据提供的信息,我们可以总结出以下关于“hdu动态规划算法集锦”的知识点: ### 动态规划基础概念 动态规划是一种解决多阶段决策问题的方法,它通过将原问题分解为互相重叠的子问题,利用子问题的解来构建原问题...

Global site tag (gtag.js) - Google Analytics