难得的中文题.

POJ1185http://poj.org/problem?id=1185

方法就是用DP[i][r][p]表示第i行状态为r,第i-1行状态是p时的最多个数。而这里p受到r的限制,而第i-2行状态q则受到r和p两个状态限制。状态转移方程就是:

DP[i][r][p] = MAX{DP[i-1][p][q] +num[r]}

其中,p是受到r的限制时枚举的状态,q是受到r和p共同限制时候的状态,num[r]表示状态r里面的布局炮兵所摆的个数。

这里我们可以看到就要枚举i,r,p,q,这4 个变量,i的范围是100,而其他几个则都是1<<10,复杂度颇为偏高。而实际上由于每一行里面有很多都是某些位置被其他位置影响的。比如:   1110001,  如果第一个位置放上炮兵,那么第二第三的位置都会受到影响,而一个也放不了。

解决方案就是不去管那些相互有影响的状态,把形如:

1000000    0100000    ... ...

1001000    0100001    ... ...

...

1001001

这些相互之间没有影响的状态找出来,这样所有的状态数就会减少至少于60种(我算了一下,好像是58种),这样一来就是60*60*60*100,可以过了。

 #include <stdio.h>
#include <string.h>
#define mem(a) memset(a,0,sizeof(a))
#define MAX(a,b) ((a) > (b) ? (a) : (b)) int DP[][][],num1[],s[],row[];
int N,M,StateNum;//StateNum记录不会产生冲突的状态数目 bool Judge(int x)//判断状态x是否存在有相邻或相隔为2的1,没有返回true
{
if(x & (x<<)) return false;
if(x & (x<<)) return false;
return true;
} int NumOf1(int x)//统计x里面1的个数
{
int num = ;
while(x) {
num++;
x &= ~(-x);
}
return num;
} void Get_Num1_s()//给num1数组和s数组赋值
{
StateNum = ;
for(int i = ; i < (<<M) ; i ++ ) if(Judge(i))//从所有的状态中找出不会产生冲突的状态
{
s[StateNum] = i;//记录这些状态
num1[StateNum] = NumOf1(i);//和这些状态1的个数
StateNum ++ ;
}
} int main()
{
while(~scanf("%d%d%*c", &N, &M))
{
char str[];
memset(DP,-,sizeof(DP));
for(int i=;i<=N;i++)
{
scanf("%s", str);
for(int j=;j<M;j++)
{
if(str[j]=='P') row[i] |= (<<j);//row记录每一行可行状态
}
} Get_Num1_s(); for(int i=;i<StateNum;i++) if( !(s[i] & ~row[]) )//给第一组状态赋初值
{
DP[][i][] = num1[i];
}
int key = ;
for(int i=;i<=N;i++)//枚举每一行
{
key = !key;
for(int r=;r<StateNum;r++) if( !(s[r] & ~row[i]) )//枚举当前行的状态,且属于当前行里
{
for(int p=;p<StateNum;p++) if( !(s[p] & s[r]) )//枚举上一行的状态,且和当前行没有冲突
{
for(int q=;q<StateNum;q++) if( !(s[q] & (s[r]|s[p])) )//枚举上上行,且与上两行没有冲突
{
if(DP[!key][p][q] != -)//必须是合法的状态才可以被记录在内
{
DP[key][r][p] = MAX(DP[key][r][p], DP[!key][p][q]+num1[r]);
}
}
}
}
}
int ans = ;
for(int i=;i<StateNum;i++)
{
for(int j=;j<StateNum;j++)
{
ans = MAX(ans, DP[key][i][j]);
}
}
printf("%d\n", ans);
}
return ;
}

POJ1185状态压缩DP的更多相关文章

  1. POJ1185 - 炮兵阵地(状态压缩DP)

    题目大意 中文的..直接搬过来... 司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队.一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平 ...

  2. DP大作战—状态压缩dp

    题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...

  3. 状态压缩DP总结

    POJ1185 炮兵部队问题: 在平原上才能放置炮兵,每个炮兵的上下左右2格之内都不能出现别的炮兵 可以考虑在当前行放置炮兵它的右侧和下侧绝对不会出现炮兵即可,左侧和上侧就能省去考虑 明显的状态压缩d ...

  4. 状态压缩DP(大佬写的很好,转来看)

    奉上大佬博客 https://blog.csdn.net/accry/article/details/6607703 动态规划本来就很抽象,状态的设定和状态的转移都不好把握,而状态压缩的动态规划解决的 ...

  5. hoj2662 状态压缩dp

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  6. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...

  7. [知识点]状态压缩DP

    // 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...

  8. HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP

    题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...

  9. 状态压缩dp问题

    问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...

随机推荐

  1. MVC+Ef项目(3) 抽象数据库访问层的统一入口;EF上下文线程内唯一

    抽象一个数据库访问层的统一入口(类似于EF的上下文,拿到上下文,就可以拿到所有的表).实际这个入口就是一个类,类里面有所有的仓储对应的属性.这样,只要拿到这个类的实例,就可以点出所有的仓储,我们在 R ...

  2. POJ 1201 Intervals (差分约束系统)

    题意 在区间[0,50000]上有一些整点,并且满足n个约束条件:在区间[ui, vi]上至少有ci个整点,问区间[0, 50000]上至少要有几个整点. 思路 差分约束求最小值.把不等式都转换为&g ...

  3. php 获取301 302的真实地址

    function getRealURL($url){ $header = get_headers($url,1); if (strpos($header[0],'301') || strpos($he ...

  4. (五)用正则化(Regularization)来解决过拟合

    1 过拟合 过拟合就是训练模型的过程中,模型过度拟合训练数据,而不能很好的泛化到测试数据集上.出现over-fitting的原因是多方面的: 1) 训练数据过少,数据量与数据噪声是成反比的,少量数据导 ...

  5. HDU 小明A+B 2096

    解题思路:So easy,练手速的,这种题很快1A,但是没有任何成就感.   转念一想,反正水题也就那几题,所以很快就会刷完. #include<cstdio> int main() { ...

  6. SSH思路

    hibernate的配置写到spring的配置中,用spring管理和调用hibernate的工厂和session等.struts的话,通常有2中.一种是用spring中的一个工厂类代替struts的 ...

  7. js sleep效果

    js sleep效果 s = setInterval(function(){ //需要执行的函数 alert("我延迟了2秒弹出"); },2000); 并不是每2秒执行一次,而是 ...

  8. nginx的配置,要求根据不同的来路域名,发送到不同的端口去处理

    这一台电脑上既有tomcat 也有 apache,他俩是没有办法同时享用80端口的.我现在让tomcat用8088,apache用8080,然后让nginx用80,这样nginx在收到请求后,根据不同 ...

  9. WORD中如何让前两页不显示页码

    WORD中如何让前两页不显示页码   上稿人:ojn 点击率: 15191   我们有时在用word编辑文档时,会遇上第一.二页无需显示页码,第三页才是正文的第一页时,该如何正确插入页码呢? 以wor ...

  10. asp.net读取xml方法

    这个适合刚学asp.net的同学,大神直接略过好了,asp.net经常会有很多用到XML的地方,比如全国省市的联动,以及一些菜单读取等等都有xml的影子,直接贴代码,以便我以后用到的时候忘了,注释我写 ...