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. Ceph分布式存储-原理介绍及简单部署

    1)Ceph简单概述Ceph是一个分布式存储系统,诞生于2004年,最早致力于开发下一代高性能分布式文件系统的项目.Ceph源码下载:http://ceph.com/download/.随着云计算的发 ...

  2. Flask使用Flask-SQLAlchemy操作MySQL数据库

    前言: Flask-SQLAlchemy是一个Flask扩展,简化了在Flask程序中使用SQLAlchemy的操作.SQLAlchemy是一个很强大的关系型数据库框架,支持多种数据库后台.SQLAl ...

  3. HTML 5 拖放

    拖放(Drag 和 drop)是 HTML5 标准的组成部分. 拖放 拖放是一种常见的特性,即抓取对象以后拖到另一个位置. 在 HTML5 中,拖放是标准的一部分,任何元素都能够拖放. 拖放事件 1. ...

  4. C. Rectangles

    链接 [http://codeforces.com/group/1EzrFFyOc0/contest/1028/problem/C] 题意 给你n个矩形的左下角和右上角坐标,问你至少包含在n-1个矩形 ...

  5. 个人博客作业_week14

    M1/M2阶段总结 我在M1阶段负责后端代码的开发,以及协助PM,在M2阶段负责PM,在为期将近一学期的团队软件开发过程中,我深刻体会到了团队协作的重要性,以及合理分配任务的重要性,没有一个好的时间规 ...

  6. Linux内核期末总结

    20135316王剑桥<Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC 1000029000 第一周 http://www.cn ...

  7. PAT 1004 成绩排名

    https://pintia.cn/problem-sets/994805260223102976/problems/994805321640296448 读入n名学生的姓名.学号.成绩,分别输出成绩 ...

  8. mybatis集成redis

    系统原生集成的Ehcache, 但是监控需要(version 2.7),Ehcache Monitor http://www.ehcache.org/documentation/2.7/operati ...

  9. DELPHI XE10,JSON 生成和解析,再利用INDYHTTP控件POST

    Delphi XE10,Json 生成和解析,再利用indyhttp控件Post 年09月20日 :: 阅读数: --不多说,直接上代码 procedure TFrmMain.Brand; var J ...

  10. 彻底弄懂jsonp原理及实现方法

    一. 同源策略 所有支持Javascript的浏览器都会使用同源策略这个安全策略.看看百度的解释: 同源策略,它是由Netscape提出的一个著名的安全策略. 现在所有支持JavaScript 的浏览 ...