题目

题意

一个数字正方形(所有数都是两位的正整数),取了一个数后,它的周围 $ 8 $ 个数都不能被选,问最大取数总和。

注意数据范围 $ 3=< n <=15 $ 我们可能一开始会去想暴力搜索,枚举状态,但很容易发现时间复杂度过高过不去,于是可以去想dp,先预处理出可行状态,然后枚举可行状态,以及行数,进行转移即可。

我们定义 $ f[i][j] $ 表示当前在第 $ i $ 行此时状态为 $ j $ 状态先处理出来这里只要存编号就好了

转移方程 $ f[i][k]=max(f[i][k],f[i-1][j]+sum) $

$ sum \(表示\) k $行所有可以可以取出来的数的和( $ j $是 $ k $ 的上一行

还有一些判断可行的条件看代码吧

另外就是这一题的读入比较搞人,多试试就好了

代码

#include<bits/stdc++.h>
using namespace std;
int dp[16][1600],mape[16][16],sta[1600];
int n;
char s[100];
void star(){
n=0;
memset(dp,0,sizeof(dp));
memset(mape,0,sizeof(mape));
memset(sta,0,sizeof(sta));
}
void solve(){
int cnt=0;
for(int i=0;i<(1<<n);++i){
if((!(i&(i<<1)))&&(!(i&(i>>1)))) sta[++cnt]=i;
}
for(int i=1;i<=n;++i){//行数
for(int j=1;j<=cnt;++j){//上一行的状态
for(int k=1;k<=cnt;++k){//这一行的状态
if((!(sta[k]&sta[j]))&&(!(sta[k]&(sta[j]>>1)))&&(!(sta[k]&(sta[j]<<1)))){//保证不冲突
int sum=0;
for(int u=0;u<n;++u){
if(sta[k]&(1<<u)){//可以取数
sum+=mape[i][n-u-1];//这里是n-u-1,因为二进制第u位在图上是n-u-1位
}
dp[i][k]=max(dp[i][k],dp[i-1][j]+sum);
}
}
}
}
}
int ans=0;
for(int i=1;i<=cnt;i++) ans=max(ans,dp[n][i]);
printf("%d\n",ans);
}
int main(){
while(gets(s)){
star();
int t=strlen(s);
for(int i=0;i<t;i+=3){
mape[1][n++]=(s[i]-'0')*10+(s[i+1]-'0');
}
for(int i=2;i<=n;++i){
for(int j=0;j<n;++j){
scanf("%d",&mape[i][j]);
}
}
solve();
getchar();getchar();
}
return 0;
}

hdu 2167 题解的更多相关文章

  1. Pebbles HDU 2167

    Pebbles HDU 2167 大意:给定一个N*N的方格,让你在里面取出一些数使其和最大,要求每一个数不能与其相邻的8个数同时取出. 思路:和炮兵阵地那一题有点像,但我们只需要考虑上一行的情况,这 ...

  2. hdu 2167(状压dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2167 思路:经典的状压dp题,前后,上下,对角8个位置不能取,状态压缩枚举即可所有情况,递推关系是为d ...

  3. HDU 2167 Pebbles

    题目大意:有个N*N( 3<=N<=15 )方阵, 可从中若干个数, 使其总和最大.取数要求, 当某一个数被选, 其周围8个数都不能选. 题解:记s数组为合法状态,即没有相邻的数字同时被选 ...

  4. HDU 2023题解分析

    我想说这道题我还没弄明白我错哪了,交了20多遍一直都是Runtime Error,改了N次还是不对,后来搜了一下,说是数组开小了,又把数组开大,还不对,又改发现一个平均值求错,再改,还不对,洗洗睡吧. ...

  5. HDU 2167 Pebbles(状压DP)

    题目链接:Pebbles Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  6. 2014年北京网络赛 Instrusive HDU 5040 题解 优先队列

    网赛的时候看了这道题,发现就是平常的那种基础搜索题. 由于加了一个特殊条件:可以一次消耗3秒或原地停留1秒. 那就不能使用简单的队列了,需要使用优先队列才行. 题意 告诉一副地图:一个起点,一个终点, ...

  7. hdu 5418 题解

    第一眼看到这题,哇,这不是我刚做完的题吗?大水题!然后 这题表面很水,实际上有点坑. 题意 求经过 $ 1 - n $(不能遗漏) 并且回到 $ 1 $ 的最短路. 在看这题之前我们可以来看下这题 最 ...

  8. HDU 1231 题解

    题面: 最大连续子序列 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Problem ...

  9. HDU - 5970 题解

    题目链接 HDU - 5970 分析 很显然\(f(x,y)\)与\(f(x+y*k,y)\)的结果相同,因为它们在第一次取模后会变成相同的式子 我们再看一下数据的范围,突破口肯定在\(m\)那里 那 ...

随机推荐

  1. 小程序中怎么引入wepy.js第三方toast组件

    1.先安装组件 npm install wepy-com-toast --save 2.引入wepy和toast import wepy from 'wepy' import Toast from ' ...

  2. GO获取随机数

    使用的"math/rand"包. 基本随机数 a := rand.Int() b := rand.Intn(100) //生成0-99之间的随机数 fmt.Println(a) f ...

  3. 2018-2019-2 《网络对抗技术》Exp7 网络欺诈防范 20165326

    网络欺诈防范 实践内容 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法.具体实践有 简单应用SET工具建立冒名网站 ettercap DNS spoof 结合应用两种技术, ...

  4. 记Oracle中regexp_substr的一次调优(速度提高95.5%)

    项目中需要做一个船舶代理费的功能,针对代理的船进行收费,那么该功能的第一步便是选择进行代理费用信息的录入,在进行船舶选择的时候,发现加载相关船舶信息十分的慢,其主要在sql语句的执行,因为测试的时候数 ...

  5. HearthBuddy的class276以及class247

    使用de4dot-cex反编译原版的hearthbuddy得到的 链接: https://pan.baidu.com/s/1hT79LpIjbyvODsjnkSe_5A 提取码: iemx class ...

  6. unity疯狂牧场完整项目源码 - Frenzy Farming time management game kit V1.0

    You will love this game kit! Have you ever wondered what it would be like to run your own farm? Look ...

  7. linux内核中的电源管理接口

    1. pm_runtime_enable/pm_runtime_disable 使能/禁止runtime PM,分别对dev->power.disable_depth执行++和--操作,这个变量 ...

  8. pytorch常用的padding函数

    1)ReflectionPad2d CLASS torch.nn.ReflectionPad2d(padding) 使用输入边界的反射来填充输入tensor 对于N维的填充,使用torch.nn.fu ...

  9. 提供对字符串的全角->半角,半角->全角转换

    package com.opslab.util.algorithmImpl; import com.opslab.util.StringUtil; /** * 提供对字符串的全角->半角,半角- ...

  10. Linux系统调优——网络(四)

    (1).查看网络(Network)运行状态相关工具 1)nload监控总体带宽使用情况 nload需要自己安装,而且在安装前需要安装epel-release [root@youxi1 ~]# yum ...