炮兵阵地 - POJ 1185(状态压缩)

分析:先枚举出来所有的合法状态(当N=10的时候合法状态最多也就60种),用当前状态匹配上一行和上上一行的状态去匹配,看是否可以.....复杂度100*60*60*60,也可以接受。

代码如下:

=========================================================================================================================

#include<stdio.h>
#include<algorithm>
#include<string.h>
using namespace std;

const int MAXN = 107;
const int MAXM = 67;

int dp[MAXN][MAXM][MAXM];

int HaveOne(int x, int N)
{
    int s[MAXN]={0}, sum=0;

    for(int i=N-1; i>=0; i--)
    {
        s[i] = (x&1);
        x >>= 1;
        if(s[i] && (s[i+1] || s[i+2]))
            return -1;
        if(s[i])sum++;
    }

    return sum;
}

int main()
{
    int M, N;

    while(scanf("%d%d", &M, &N) != EOF)
    {
        char s[MAXN];
        int data[MAXN]={0}, nOne[MAXM], bit[MAXM], cnt=0;

        for(int i=0; i<(1<<N); i++)
        {
            nOne[cnt] = HaveOne(i, N);
            if(nOne[cnt] != -1)
            {
                bit[cnt++] = i;
            }
        }

        for(int i=2; i<=M+1; i++)
        {
            scanf("%s", s);
            for(int j=0; j<N; j++)
                data[i] = data[i]*2 + (s[j]==‘P‘ ? 0 : 1);
        }

        memset(dp, false, sizeof(dp));

        int ans=0;

        for(int t=2; t<=M+1; t++)
        {
            for(int i=0; i<cnt; i++)if( !(bit[i] & data[t]) )
            for(int j=0; j<cnt; j++)if( !(bit[j] & data[t-1]) )
            for(int k=0; k<cnt; k++)if( !(bit[k] & data[t-2]) )
            {
                if(!(bit[i] & bit[j]) && !(bit[j] & bit[k]) && !(bit[i] & bit[k]))
                {
                    dp[t][i][j] = max(dp[t][i][j], dp[t-1][j][k]+nOne[i]);
                    ans = max(ans, dp[t][i][j]);
                }
            }
        }

        printf("%d\n", ans);
    }

    return 0;
}
时间: 2024-11-03 15:06:03

炮兵阵地 - POJ 1185(状态压缩)的相关文章

Corn Fields POJ - 3254 &amp;&amp; 炮兵阵地 POJ - 1185

第一个题题目链接: POJ - 3254 第二个题题目链接:POJ - 1185 第一个题的题目大意:给你一个n*m的01矩阵,然后让你安排奶牛,只有为1的地方能安置奶牛,0的地方不能安置奶牛.当在一个为1的地方安置奶牛的时候,这个奶牛的四周都不能防止奶牛,会起冲突.然后问你一共有多少种安置方案. 具体思路:我们把每一行按照二进制压缩,然后每一次枚举合法的状态,看是否能安置上奶牛,然后枚举当前一行的时候,判断是否冲突就好了.然后最终计算答案的时候累加最后一行为某一个合法状态时的方案数. AC代码

poj 1185 状态压缩

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

炮兵阵地 POJ 1185

n*m P 和 M P可以放人 M不行 人不能相互打到 问最多可以放多少人 #include<stdio.h> #include<algorithm> #include<string.h> #include<math.h> #include<map> using namespace std; #define MAXN 1<<10 char z[105][15]; int x[105]; int dp[105][200][200]; i

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

吐槽一下,刚做完两个状压的题,想着是一样的思路.没想到被坑了 有点类似于图论题目中不用邻接矩阵而用存储点将数据规模从输入范围->输入量 刚开始看题以为是攻击范围也不能重合,于是就是考虑到4次的范围.然后就是i-1,j-2两行如何组合而成. 果断TLE,如果用dp[maxn][1<<10][1<<10],MLE,TLE. 其实换个思路,10个方格的组合情况其实至多就只有60种,可以换成存储个数. 不吐槽了,贴一个代码.懒得自己写了. #include <iostream&

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