Solution:状态压缩

因为设置炮兵的局限性(同行两炮兵相差要大于2),一行10个数最多有60种可能性(程序计算)

  其中判断可能性的好方法是:

if ((i & (i << 1))==0 && (i & (i << 2))==0
             && (i & (i >> 1))==0 && (i & (i >> 2))==0)

      代表不能有左1,左2,右1,右2相邻的1

行数相差2以上,两行互相之间没有影响

  

  if j,k,l不冲突

f[i][j][k]=max(f[i][j][k],f[i-1][k][l]+v[j])

其中i为第i行,j为第i行的状态,k为第(i-1)行的状态,l为第(i-2)行的状态,v为在第i行的状态j可以设置的炮兵数

f[i][j][k]为前i行,以j,k状态下设置的最多的炮兵数,而第i行设置炮兵只与i-1,i-2行有关(前i行中)

时间复杂度:n*f(t)*f(t)*f(t)

f(t)为一行t个数,设置炮兵的可能性

n<=100,m<=10 即 100*60*60*60=21600000

事实上,由于地形的限制(山地不能建炮兵)和行与行之间的限制(同列两炮兵相差要大于2),时间复杂度小于此

 #include <stdio.h>
#include <stdlib.h> int max(int a,int b)
{
if (a>b)
return a;
else
return b;
} int main()
{
//100*1024*1024
int i,j,k,l,m,n,f[][][],use[][],map[]={},s[],v[]={},ans=,g=;
int er[]={,,,,,,,,,,};
char c;
scanf("%d%d",&m,&n);
scanf("%c",&c);
for (i=;i<m;i++)
{
for (j=n-;j>=;j--)
{
scanf("%c",&c);
if (c=='H')
map[i]+=er[j];
}
scanf("%c",&c);
}
/*
for (i=0;i<m;i++)
printf("%d\n",map[i]);
printf("\n");
*/
for (i=;i<er[n];i++)
if ((i & (i << ))== && (i & (i << ))==
&& (i & (i >> ))== && (i & (i >> ))==)
{
ans++;
s[ans]=i;
j=i;
while (j)
{
j&=(j-);
v[ans]++;
}
}
/*
printf("ans=%d\n",ans);
for (i=0;i<er[n];i++)
printf("%d %d个 ",s[i],v[i]);
*/
//init
for (i=;i<m;i++)
use[i][]=;
for (i=;i<m;i++)
for (j=;j<=ans;j++)
for (k=;k<=ans;k++)
f[i][j][k]=;
//row
for (i=;i<m;i++)
//each row , posibility
for (j=;j<=ans;j++)
if ((map[i] & s[j])==)
{
use[i][]++;
use[i][use[i][]]=j; //编号 cur + bcur + bpre
if (i>=)
{
for (k=;k<=use[i-][];k++)
if ((s[j] & s[use[i-][k]])==)
for (l=;l<=use[i-][];l++)
if ((s[j] & s[use[i-][l]])==
&& (s[use[i-][k]] & s[use[i-][l]])==)
f[i][j][use[i-][k]]=max(f[i][j][use[i-][k]],f[i-][use[i-][k]][use[i-][l]]+v[j]);
}
else if (i==)
{
for (k=;k<=use[i-][];k++)
if ((s[j] & s[use[i-][k]])==)
f[i][j][use[i-][k]]=max(f[i][j][use[i-][k]],f[i-][use[i-][k]][]+v[j]);
}
else
f[i][j][]=v[j]; }
if (m!=)
{
for (k=;k<=use[m-][];k++)
for (l=;l<=use[m-][];l++)
if ((s[use[m-][k]] & s[use[m-][l]])==)
g=max(g,f[m-][use[m-][k]][use[m-][l]]);
}
else
{
for (k=;k<=use[m-][];k++)
g=max(g,f[m-][use[m-][k]][]);
}
printf("%d\n",g);
/*
for (i=0;i<m;i++)
{
for (j=1;j<=ans;j++)
for (k=1;k<=ans;k++)
//printf("f[%d][%d][%d]=%d\n",i,j,k,f[i][j][k]);
printf("%d ",f[i][j][k]);
printf("\n\n");
}
for (k=1;k<=use[m-1][0];k++)
for (l=1;l<=use[m-2][0];l++)
printf("%d %d %d\n",s[use[m-1][k]],s[use[m-2][l]],f[m-1][use[m-1][k]][use[m-2][l]]);
*/
return ;
}

错误代码:

  if j,k,l不冲突

  f[i][j]=max(f[i][j],f[i-2][l]+v[k]+v[j]);

其中i为第i行,j为第i行的状态,k为第(i-1)行的状态,l为第(i-2)行的状态,v为在第i行的状态j可以设置的炮兵数

f[i][j]为前i行,以j状态下设置的最多的炮兵数

  但是l,k可能会发生冲突,在f[i-2][l]下,第(i-1)行不能用k状态

第三行,在第1,4个建炮兵情况下,

8 4

HPPH

PPPP-----是以右上方的P为基础,与第三行发生冲突

HPPH

PHHP

PHHP

HPPH

PPPP

HPPH

 #include <stdio.h>
#include <stdlib.h> int max(int a,int b)
{
if (a>b)
return a;
else
return b;
} int main()
{
int i,j,k,l,m,n,f[][],use[][],map[]={},s[],v[]={},ans=,g=;
int er[]={,,,,,,,,,,};
char c;
scanf("%d%d",&m,&n);
scanf("%c",&c);
for (i=;i<m;i++)
{
for (j=n-;j>=;j--)
{
scanf("%c",&c);
if (c=='H')
map[i]+=er[j];
}
scanf("%c",&c);
}
/*
for (i=0;i<m;i++)
printf("%d\n",map[i]);
printf("\n");
*/
for (i=;i<er[n];i++)
if ((i & (i << ))== && (i & (i << ))==
&& (i & (i >> ))== && (i & (i >> ))==)
{
ans++;
s[ans]=i;
j=i;
while (j)
{
j&=(j-);
v[i]++;
}
}
/*
printf("ans=%d\n",ans);
for (i=0;i<er[n];i++)
printf("%d ",v[i]);
*/
for (i=;i<m;i++)
use[i][]=;
for (i=;i<m;i++)
for (j=;j<er[i];j++)
f[i][j]=;
//row
for (i=;i<m;i++)
{
//each row , posibility
for (j=;j<=ans;j++)
if ((map[i] & s[j])==)
{
use[i][]++;
use[i][use[i][]]=s[j];
if (i>=)
{
for (k=;k<=use[i-][];k++)
if ((s[j] & use[i-][k])==)
for (l=;l<=use[i-][];l++)
if ((s[j] & use[i-][l])==
&& (use[i-][k] & use[i-][l])==)
f[i][s[j]]=max(f[i][s[j]],f[i-][use[i-][l]]+v[use[i-][k]]+v[s[j]]);
}
else if (i==)
{
for (k=;k<=use[i-][];k++)
if ((s[j] & use[i-][k])==)
f[i][s[j]]=max(f[i][s[j]],f[i-][use[i-][k]]+v[s[j]]);
}
else
f[i][s[j]]=v[s[j]];
}
}
for (i=;i<=use[m-][];i++)
g=max(g,f[m-][use[m-][i]]);
printf("%d\n",g);
/*
for (i=0;i<m;i++)
{
for (j=0;j<er[n];j++)
printf("%d ",f[i][j]);
printf("\n");
}
*/
return ;
}

poj1185炮兵阵地 正确代码及错误代码分析的更多相关文章

  1. [poj1185]炮兵阵地_状压dp

    炮兵阵地 poj-1185 题目大意:给出n列m行,在其中添加炮兵,问最多能加的炮兵数. 注释:n<=100,m<=10.然后只能在平原的地方建立炮兵. 想法:第2到状压dp,++.这题显 ...

  2. POJ1185 炮兵阵地 —— 状压DP

    题目链接:http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions ...

  3. POJ1185 炮兵阵地 和 POJ2411 Mondriaan's Dream

    炮兵阵地 Language:Default 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 34008 Accepted ...

  4. POJ1185炮兵阵地【动态规划】

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 26892   Accepted: 10396 Descriptio ...

  5. poj1185 炮兵阵地【状压DP】

    炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 32802   Accepted: 12650 Descriptio ...

  6. POJ1185 炮兵阵地 状态压缩

    因为不知道不同的博客怎么转,就把别人的复制过来了,这个题解写的非常好,原地址为: http://hi.baidu.com/wangxustf/item/9138f80ce2292b8903ce1bc7 ...

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

    POJ飞翔.数据弱 ZQOJ飞翔 数据强 Description 司令部的将军们打算在N×M的网格地图上部署他们的炮兵部队.一个N×M的地图由N行M列组成,地图的每一格可能是山地(用"H&q ...

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

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

  9. poj1185炮兵阵地

    #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> ...

随机推荐

  1. GlusterFS分布式存储集群部署记录-相关补充

    接着上一篇Centos7下GlusterFS分布式存储集群环境部署记录文档,继续做一些补充记录,希望能加深对GlusterFS存储操作的理解和熟悉度. ======================== ...

  2. centos下升级git版本的操作记录

    在使用git pull.git push.git clone的时候,或者在使用jenkins发版的时候,可能会报类似如下的错误: error: The requested URL returned e ...

  3. svg矢量图在flex布局中样式扭曲的问题

    问题机型 小米5 华为nova 其他未知的可能机型 问题描述 利用flex 布局的一行中, 左一样式: -webkit-box-flex: 0; flex: 0 1 auto; 左二样式: -webk ...

  4. CentOS 网卡自动启动、配置等ifcfg-eth0教程

    装完centos后发现网卡没有自动启动, vi /etc/sysconfig/network-scripts/ifcfg-eth0 将ONBOOT=no 改为yes即可 原文链接: http://yp ...

  5. Linux内核及分析 第一周 计算机是如何工作的?

    C语言代码: int g(int x) { return x + 5; } int f(int x) { return g(x); } int main(void) { return f(5) + 1 ...

  6. 201303014001 张敏 计科高职13-1 github使用心得

    Github:https://github.com/zhangmin131/text 个人心得体会: Git是一种良好的.支持分支管理的代码管理方式,能很好地解决团队之间协作的问题.每个工程师在自己本 ...

  7. Golang 入门~~基础知识

    变量声明 //通用形式,指定变量名,变量类型,变量值 var name int = 99 fmt.Println(name) //指定变量名,以及变量类型,未指定值的时候默认是类型零值 var age ...

  8. HDU 2043 密码

    http://acm.hdu.edu.cn/showproblem.php?pid=2043 Problem Description 网上流传一句话:"常在网上飘啊,哪能不挨刀啊-" ...

  9. Kitematic when login show Error:Tunning socket could not be established

    https://cn.bing.com/search?q=tunning+socket+could+not+be+established&qs=n&form=QBRE&sp=- ...

  10. 兼容IE-FireFox-Chrome的背景音乐播放

    以music目录下的kn.mp3文件为例: <bgsound src="music/kn.mp3" loop="-1"/> <audio sr ...