首页 > 代码库 > POJ 1185 炮兵阵地 (状压DP)
POJ 1185 炮兵阵地 (状压DP)
题目地址:POJ 1185
这题的一个判断条件写错了。。导致错了好多遍。。sad。。
这题跟3254差不多。
可以发现,对于每一行放大炮的状态,只与它上面一行和上上一行的状态有关,每一行用状态压缩的表示方法,0表示不放大炮,1表示放大炮,同样的,先要满足硬件条件,即有的地方不能放大炮,然后就是每一行中不能有两个1的距离小于2(保证横着不互相攻击),这些要预先处理一下。然后就是状态表示和转移的问题了,因为是和前两行的状态有关,所以要开个三维的数组来表示状态,当前行的状态可由前两行的状态转移而来。即如果当前行的状态符合前两行的约束条件(不和前两行的大炮互相攻击),则当前行的最大值就是上一个状态的值加上当前状态中1的个数(当前行放大炮的个数)
代码如下:
#include <iostream> #include <string.h> #include <math.h> #include <queue> #include <algorithm> #include <stdlib.h> #include <map> #include <set> #include <stdio.h> using namespace std; #define LL __int64 #define pi acos(-1.0) const int mod=100000000; const int INF=0x3f3f3f3f; const double eqs=0.01; char s[110][12]; int dp[110][100][100], num[1100]; vector<int>vec[110]; int Cal(int x, int m) { int i, ans=0; for(i=0; i<m; i++) { if(x&(1<<i)) ans++; } return ans; } void init(int n,int m, int tot) { int i, j, flag, k; for(i=0; i<n; i++) { for(j=0; j<tot; j++) { flag=0; for(k=0; k<m; k++) { if(j&(1<<k)) { if(s[i][k]=='H') { flag=1; break; } } } if(!flag&&!(j&(j<<1))&&!(j&(j<<2))) { vec[i].push_back(j); } } } for(i=0; i<tot; i++) { num[i]=Cal(i,m); } } int main() { int n, m, i, j, tot, k, h, max1; //("1.txt","r",stdin); //freopen("2.txt","w",stdout); while(scanf("%d%d",&n,&m)!=EOF) { for(i=0;i<n;i++){ vec[i].clear(); } for(i=0; i<n; i++) { scanf("%s",s[i]); } tot=1<<m; memset(dp,0,sizeof(dp)); init(n,m,tot); max1=0; for(i=0; i<vec[0].size(); i++) { max1=max(max1,num[vec[0][i]]); } for(i=1; i<n; i++) { for(j=0; j<vec[i].size(); j++) { for(k=0; k<vec[i-1].size(); k++) { if(vec[i][j]&vec[i-1][k]) continue ; if(i==1) { dp[1][j][k]=num[vec[0][k]]+num[vec[1][j]]; max1=max(max1,dp[i][j][k]); continue ; } for(h=0; h<vec[i-2].size(); h++) { if((vec[i][j]&vec[i-2][h])||(vec[i-1][k]&vec[i-2][h])) continue ; dp[i][j][k]=max(dp[i][j][k],dp[i-1][k][h]+num[vec[i][j]]); max1=max(max1,dp[i][j][k]); } } } } printf("%d\n",max1); } return 0; }
POJ 1185 炮兵阵地 (状压DP)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。