HDU 4539

简单状压DP,忘 了初始化,忘 了&和==的优先级,坑了我十几个WA。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

int dp[110][222][222];

int row[110];
int status[1<<10];
int counts[1<<10];

int getNum(int s){
	int ret=0;
	while(s){
		if(s&1) ret++;
		s>>=1;
	}
	return ret;
}

int main(){
	int n,m,t,cnt;
	while(scanf("%d%d",&n,&m)!=EOF){
		for(int i=1;i<=n;i++){
			row[i]=0;
			for(int j=0;j<m;j++){
				scanf("%d",&t);
				if(t==0) row[i]<<=1;
				else row[i]=(row[i]<<1)|1;
			}
		}
		cnt=0;
		for(int i=0;i<(1<<m);i++){
			if((i<<2)&i||(i>>2)&i)continue;
			status[cnt++]=i;
			counts[cnt-1]=getNum(i);
		}
		memset(dp,0,sizeof(dp));
		int ans=0;
		for(int i=1;i<=n;i++){
			if(i==1){
				for(int j=0;j<cnt;j++){
					if((status[j]&row[1])==status[j])
					dp[i][j][0]=counts[j];
				}
				continue;
			}
			for(int k=0;k<cnt;k++){
				if((status[k]&row[i])!=status[k]) continue;
				for(int j=0;j<cnt;j++){
					if(status[k]&status[j]) continue;
					for(int p=0;p<cnt;p++){
						if((status[p]&(status[j]>>1))||(status[p]&(status[j]<<1))) continue;
						if((status[k]&(status[p]>>1))||(status[k]&(status[p]<<1))) continue;
						dp[i][k][p]=max(dp[i][k][p],dp[i-1][p][j]+counts[k]);
					}
				}
			}
		}
        ans=0;
        for(int i=0;i<cnt;i++){
            for(int j=0;j<cnt;j++){
                ans=max(ans,dp[n][i][j]);
            }
        }
        printf("%d\n",ans);
	}
	return 0;
}

  

时间: 2024-08-03 17:53:07

HDU 4539的相关文章

HDU 4539 郑厂长系列故事——排兵布阵 (状态压缩DP)

中文题,题意不再累赘. 思路:对于第 i 行的放士兵,影响它的只有第 i-1 行和 i-2 行,所以暴力枚举符合这三行的状态 state[i],state[j],state[k].  接下来就是二进制的巧妙应用了. 具体题解看代码注释!!! #include<cstdio> #include<stdlib.h> #include<string.h> #include<string> #include<map> #include<cmath&

HDU 4539郑厂长系列故事――排兵布阵(状压DP)

HDU 4539  郑厂长系列故事――排兵布阵 基础的状压DP,首先记录先每一行可取的所哟状态(一行里互不冲突的大概160个状态), 直接套了一个4重循环居然没超时我就呵呵了 1 //#pragma comment(linker,"/STACK:102400000,102400000") 2 #include <map> 3 #include <set> 4 #include <stack> 5 #include <queue> 6 #i

HDU 4539 郑厂长系列故事——排兵布阵

http://acm.hdu.edu.cn/showproblem.php?pid=4539 郑厂长系列故事——排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 1708    Accepted Submission(s): 620 Problem Description 郑厂长不是正厂长 也不是副厂长 他根本就不是厂长 事实上

HDU 4539 郑厂长系列故事――排兵布阵(状态压缩)

郑厂长系列故事--排兵布阵 Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Submission(s): 1954    Accepted Submission(s): 701 Problem Description 郑厂长不是正厂长 也不是副厂长 他根本就不是厂长 事实上 他是带兵打仗的团长 一天,郑厂长带着他的军队来到了一个n*m的平原准备布阵. 根据以往的战

HDU 4539 郑厂长系列故事――排兵布阵

/* 曼哈顿距离的定义是:两个点的坐标为(x1,y1),(x2,y2),两点的曼哈顿距离为|x1-x2|+|y1-y2| 题意:题上要求是两个士兵的距离不能是曼哈顿距离为2,意思就是这个点在同一行同一列不能相间,这个点的左上,左下,右上,右下角不能有 士兵. 思路:dp+状态压缩dp[i][j][k]定义的状态为i是当前行,j为当前行的状态,k为上一行的状态类似炮兵阵地 */ #include<stdio.h> #include<string.h> #define Max(a,b)

HDU 4539 郑厂长系列故事——排兵布阵 &lt;&lt;状压dp

思路 被这道题折磨死了,只是发上来纪念一下,思路同方格取数(1),我已经疯了! 代码 1 #include<bits/stdc++.h> 2 using namespace std; 3 int maze[110][15]; 4 int n,m; 5 vector<int> all[110]; 6 int dp[110][200][200]; 7 int num[1<<10]; 8 bool check(int r,int state) 9 { 10 for(int i

ACM总结——dp专辑(转)

感谢博主——      http://blog.csdn.net/cc_again?viewmode=list       ----------  Accagain  2014年5月15日 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. 本人动态规划博客地址:http://blog.csdn.net/cc_again/article/category/1261899 ***********************

【DP专辑】ACM动态规划总结

转载请注明出处,谢谢.   http://blog.csdn.net/cc_again?viewmode=list          ----------  Accagain  2014年5月15日 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. 本人动态规划博客地址:http://blog.csdn.net/cc_again/article/category/1261899 ******************

(转)dp动态规划分类详解

dp动态规划分类详解 转自:http://blog.csdn.NET/cc_again/article/details/25866971 动态规划一直是ACM竞赛中的重点,同时又是难点,因为该算法时间效率高,代码量少,多元性强,主要考察思维能力.建模抽象能力.灵活度. ****************************************************************************************** 动态规划(英语:Dynamic programm