博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
poj -- 1185 炮兵阵地
阅读量:4286 次
发布时间:2019-05-27

本文共 1700 字,大约阅读时间需要 5 分钟。

题解:二进制压缩,枚举每行存在的状态,判断与前一行的状态的关系,找出最大值

dp[i][j][k] = max(dp[i][j][k] , dp[i-1][k][[l] + p[j]) 表示第i行第j个状态,i-1行的第k个状态炮兵的最大数量

#include
#include
#include
#include
using namespace std;int dp[105][70][70];char map[105][20];int a[105];int s[70],p[70];int n,m,num;bool ok(int x){ if(x&(x<<1)) return false; //如果x的二进制里存在为类似于 11 则不满足 if(x&(x<<2)) return false; //如果x的二进制里存在为类似于 101或11,则不满足 return true;}void init(){//求解多少种符合的状态 num = 0; for(int i = 0;i < (1<
<= n;i++){ scanf("%s",map[i]+1); a[i] = 0; for(int j = 1;j <= m;j++){ if(map[i][j] == 'H') a[i] +=(1<<(j-1));//记录每一行有山地的状态 } } memset(dp,0,sizeof(dp)); memset(p,0,sizeof(p)); for(int i = 1;i <= num;i++){ p[i] = cal(s[i]); //p[i] 存储每种状态的的山地的个数 if(find(s[i],1)) dp[1][i][1] = p[i]; //判定此状态下是否与存在山地的状态矛盾 } for(int i = 2;i <= n;i++){ for(int j= 1;j <= num;j++){ if(!find(s[j],i)) continue; for(int k = 1;k <= num;k++){ if(s[k]&s[j]) continue; for(int l = 1;l <= num;l++){ if(s[l]&s[j]) continue;// if(dp[i-1][j][k] == -1) continue; dp[i][j][k] = max(dp[i][j][k],dp[i-1][k][l] + p[j]); //用第i行的状态为j,第i-1行状态为k时的值 } } } } int ans = 0; for(int i = 1;i <= num;i++){ for(int j = 1;j <= num;j++){ ans = max(ans,dp[n][i][j]); } } printf("%d\n",ans); }}

转载地址:http://kdsgi.baihongyu.com/

你可能感兴趣的文章
ng-include指令
查看>>
AngularJS动画(二)
查看>>
.Net编译器Roslyn(一)
查看>>
C# 6.0新特性整理
查看>>
Sublime Text插件之Css3
查看>>
查看当前Git工具的版本
查看>>
AngularJS路由之ui-router(三)
查看>>
Sublime Text插件之HTML-CSS-JS Prettify
查看>>
Sublime Text插件之JavaScript Completions
查看>>
C#编码规范整理
查看>>
C#Nullable<T>可空的值类型,C#中的?使用整理
查看>>
EntityFramework中JSON序列化循环引用----JavaScriptSerializer
查看>>
EntiryFramework中事务操作实例
查看>>
删除github上的远程分支
查看>>
Visual Studio Code 1.8 发布
查看>>
SQL Server Management Studio 2016 (SSMS)
查看>>
EF中Sum()异常:到值类型“System.Decimal”的强制转换失败,因为具体化值为 null。
查看>>
Visual Studio Code插件之Atom One Dark Syntax Theme
查看>>
EntiryFramework中事务操作(二)TransactionScope
查看>>
EF获取非跟踪数据之DBSet.AsNoTracking()
查看>>