poj 1185 炮兵阵地

本文提供了一道来自POJ平台的题目解答思路与代码实现。该题涉及状态压缩DP算法,通过对棋盘格进行状态编码,解决炮兵攻击问题。文章详细展示了如何使用递归枚举和动态规划来寻找最优解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://poj.org/problem?id=1185

#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAXX=61; int map[105]; int st[MAXX]; int cnt[MAXX]; int dp[105][MAXX][MAXX]; int ss; int max(int a,int b) { return a>b?a:b; } bool IsCan(int a){ if(a&(a<<1))return false; if(a&(a<<2))return false; return true; } int Sum(int a){// 通过移位求x中一的个数,也就是这行中大炮的个数 int b=0; while(a>0){ if(a&1)b++; a>>=1; } return b; } void GetState(int n)// 求出所有可能的状态。 { int limit=1<<n; for(int i=0;i<limit;i++) { if(IsCan(i)) { st[ss]=i; cnt[ss++]=Sum(i); } } } int main() { int row,col,i,j,k,r; char ch; scanf("%d%d",&row,&col); ss=0; GetState(col);//printf("%d\n",cnt);可在这里输出一下总共有多少种状态,输出为60种 memset(dp,-1,sizeof(dp)); getchar(); for(i=0;i<row;i++) { for(j=0;j<col;j++) { ch=getchar(); if(ch=='H')map[i] |= (1<<j); } getchar(); } for(i=0;i<ss;i++) { if(!(st[i]&map[0])){ dp[0][0][i]=cnt[i]; } } for(r=1;r<row;r++){ for(i=0;i<ss;i++){//r 行状态枚举 if(st[i]&map[r])continue; for(j=0;j<ss;j++){ //r-1 行状态枚举 if(st[i]&st[j])continue; for(k=0;k<ss;k++){//r-2行状态枚举 if(st[i]&st[k])continue; if(dp[r-1][k][j]==-1)continue; dp[r][j][i]=max(dp[r][j][i],dp[r-1][k][j]+cnt[i]); } } } } int big=-2; for(i=0;i<ss;i++){ for(j=0;j<ss;j++){ if(big<dp[row-1][i][j]){ big=dp[row-1][i][j]; } } } printf("%d\n",big); return 0; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值