POJ 1185(状态压缩原来还可以这样)

吐槽一下,刚做完两个状压的题,想着是一样的思路。没想到被坑了

有点类似于图论题目中不用邻接矩阵而用存储点将数据规模从输入范围->输入量

刚开始看题以为是攻击范围也不能重合,于是就是考虑到4次的范围。然后就是i-1,j-2两行如何组合而成。

果断TLE,如果用dp[maxn][1<<10][1<<10],MLE,TLE。

其实换个思路,10个方格的组合情况其实至多就只有60种,可以换成存储个数。

不吐槽了,贴一个代码。懒得自己写了。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <string>
#include <queue>
#include <algorithm>
#include <map>
#include <cmath>
#include <iomanip>
#define INF 99999999
typedef long long LL;
using namespace std;

const int MAX=100+10;
int n,m,lastsize,lastlastsize,nowsize;
int last[MAX],lastlast[MAX],now[MAX];
int num[MAX],dp[MAX][MAX],temp[MAX][MAX];//dp[k][i][j]表示第k行选择i方案,第k-1行选择j方案的最大炮兵数
char Map[MAX][MAX];

void dfs(int id,int k,int p,int sum){
	if(k>=m){now[++nowsize]=p;num[nowsize]=sum;return;}
	if(Map[id][k] == 'P')dfs(id,k+3,p|(1<<k),sum+1);
	dfs(id,k+1,p,sum);
}

void DP(){
	for(int k=1;k<=n;++k){
		memset(now,0,sizeof now);
		nowsize=0;
		dfs(k,0,0,0);
		for(int i=1;i<=nowsize;++i)for(int j=1;j<=lastsize;++j)dp[i][j]=0;
		for(int i=1;i<=nowsize;++i){//本行选择第几个方案
			for(int j=1;j<=lastsize;++j){//上一行选择第几个方案
				for(int t=1;t<=lastlastsize;++t){//上上行选择第几个方案
					if(now[i] & last[j])continue;//与上一行j方案不能共存
					if(now[i] & lastlast[t])continue;//与上上行t方案不能共存
					if(dp[i][j]<temp[j][t]+num[i])dp[i][j]=temp[j][t]+num[i];
				}
			}
		}
		for(int i=1;i<=nowsize;++i)for(int j=1;j<=lastsize;++j)temp[i][j]=dp[i][j];
		for(int i=1;i<=lastsize;++i)lastlast[i]=last[i];lastlastsize=lastsize;
		for(int i=1;i<=nowsize;++i)last[i]=now[i];lastsize=nowsize;
	}
}

int main(){
	while(~scanf("%d%d",&n,&m)){
		for(int i=1;i<=n;++i)scanf("%s",Map[i]);
		last[1]=lastlast[1]=temp[1][1]=0;
		lastsize=lastlastsize=1;
		DP();
		int sum=0;
		for(int i=1;i<=lastsize;++i){
			for(int j=1;j<=lastlastsize;++j){
				if(temp[i][j]>sum)sum=temp[i][j];
			}
		}
		printf("%d\n",sum);
	}
	return 0;
}
时间: 2024-10-22 21:06:11

POJ 1185(状态压缩原来还可以这样)的相关文章

poj 1185 状态压缩

炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 27926   Accepted: 10805 Description 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图.在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队):一支炮兵部队在地图上的攻

Mondriaan&#39;s Dream(POJ 2411状态压缩dp)

题意:用1*2的方格填充m*n的方格不能重叠,问有多少种填充方法 分析:dp[i][j]表示i行状态为j时的方案数,对于j,0表示该列竖放(影响下一行的该列),1表示横放成功(影响下一列)或上一列竖放成功.状态转移时,枚举每一行可能的状态上一行取反得下一行能放的状态. #include <map> #include <set> #include <list> #include <cmath> #include <queue> #include &

POJ 3311 状态压缩DP

题意:求从0点走到所有点又走回来的最短距离 该题又很多做法,我用的是弗洛伊德+状态压缩 先遍历所有点,求出两点间最短的距离,而后用状态压缩表示该点是否走过,(1<<n)-1则表示所有点都走过. 附AC代码 #include<stdio.h> #include<string.h> int map[12][12]; int dp[(1<<12)+1][12]; int min1(int a,int b) { if(a<b) return a; return

poj 1324 状态压缩+bfs

http://poj.org/problem?id=1324 Holedox Moving Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 17042   Accepted: 4065 Description During winter, the most hungry and severe time, Holedox sleeps in its lair. When spring comes, Holedox wakes

POJ 2411 状态压缩递,覆盖方案数

无非就是横着放与竖着放,状态中用1表示覆盖,0表示未覆盖. 1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 #include <string> 5 #include <string.h> 6 #include <stdio.h> 7 #include <queue> 8 #include <stack> 9 #include

poj 3250 状态压缩dp入门

Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 7798   Accepted: 4159 Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yumm

poj 3254 状态压缩

Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 15285   Accepted: 8033 Description Farmer John has purchased a lush new rectangular pasture composed of M by N (1 ≤ M ≤ 12; 1 ≤ N ≤ 12) square parcels. He wants to grow some yum

poj 2688 状态压缩dp解tsp

题意: 裸的tsp. 分析: 用bfs求出任意两点之间的距离后可以暴搜也可以用next_permutation水,但效率肯定不如状压dp.dp[s][u]表示从0出发访问过s集合中的点,目前在点u走过的最短路程. 代码: //poj 2688 //sep9 #include <iostream> #include <queue> using namespace std; const int maxW=32; const int maxN=12; int dx[4]={-1,1,0,

hdu1143 状态压缩dp 记忆化搜索写法

http://poj.org/problem?id=1143 Description Christine and Matt are playing an exciting game they just invented: the Number Game. The rules of this game are as follows. The players take turns choosing integers greater than 1. First, Christine chooses a