频道栏目
首页 > 资讯 > 其他 > 正文

POJ1185 炮兵阵地

17-09-06        来源:[db:作者]  
收藏   我要投稿

题解:

可以发现,对于每一行放大炮的状态,只与它上面一行和上上一行的状态有关,每一行用状态压缩的表示方法,0表示不放大炮,1表示放大炮,同样的,先要满足硬件条件,即有的地方不能放大炮,然后就是每一行中不能有两个1的距离小于2(保证横着不互相攻击),这些要预先处理一下。然后就是状态表示和转移的问题了,因为是和前两行的状态有关,所以要开个三维的数组来表示状态,当前行的状态可由前两行的状态转移而来。即如果当前行的状态符合前两行的约束条件(不和前两行的大炮互相攻击),则当前行的最大值就是上一个状态的值加上当前状态中1的个数(当前行放大炮的个数) 
【状态表示】dp[i][j][k] 表示第i行状态为k,第i-1状态为j时的最大炮兵个数。 
【状态转移方程】dp[i][k][t] =max(dp[i][k][t],dp[i-1][j][k]+num[t]); num[t]为t状态中1的个数 
【DP边界条件】dp[1][1][i] =num[i] 状态i能够满足第一行的硬件条件(注意:这里的i指的是第i个状态,不是一个二进制数,开一个数组保存二进制状态)
    #include 
#include 
using namespace std;
#define max(a,b) (a) > (b) ? (a) : (b)

int N,M;
char map[110][20],num[110],top;
int stk[70],cur[110];
int dp[110][70][70];

inline bool ok(int x){  //判断该状态是否合法,即不存在相邻的1之间的距离小于3的
    if(x&(x<<1)) return 0;
    if(x&(x<<2)) return 0;
    return 1;
}
//找到所有可能的合法状态,最多60种
inline void jinit()
{
    top=0;
    int i,total=1<
        
   
相关TAG标签
上一篇:poj3254 Corn Fields(状态压缩)
下一篇:Unity轻轻轻轻轻量级多人在线聊天系统
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站