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

题目大意:中文题目就不多说大意了

解题思路:
1.每行最多只有十个位置,且不是山地就是平原,那么就可以用1表示山地,0表示平原,将每一行的状态进行压缩了

2.接着找出每行能放炮兵的状态,先不考虑其他行放炮兵和该行的山地对其造成的影响,枚举出所有的状态,并记录每个状态下放的炮兵数量
在上述情况下放炮兵,只需要考虑同行的炮兵是否会相互攻击就可以了,那只需要判断他的左边第一个位置是否有炮兵和左边第二个位置是否有炮兵即可

3.接着进行dp,因为影响因素有两个,一个是上一行的状态,另一个是上两行的状态,所以设dp[row][i][j]为第row行,放置状态为i,第row-1行,放置状态为j的情况下所能放的最多炮兵数量
可得到转移方程,在前两行不影响该行放置的
dp[row][i][j] = max(dp[row][i][j], dp[row-1][j][k] + i状态下能放置的炮兵数)

参考了这位大神的代码,写得非常得详细这里写链接内容

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
#define maxn 110
#define maxm 20
#define maxs 70
int R, C, cnt;
char str[15];
int row[maxn], num[maxn], statu[maxn];
int dp[maxn][maxs][maxs];
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值