题目

题意

一个数字正方形(所有数都是两位的正整数),取了一个数后,它的周围 $ 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. Spring boot druid 的配置使用

    依赖加入 <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artif ...

  2. 如何在wcf中用net tcp协议进行通讯

    快速阅读 如何在wcf中用net tcp协议进行通讯,一个打开Wcf的公共类.比较好好,可以记下来. 配置文件中注意配置 Service,binding,behaviors. Service中配置en ...

  3. 范仁义web前端介绍课程---1、课程意义

    范仁义web前端介绍课程---1.课程意义 一.总结 一句话总结: 提供的这一整套学习方法和资源,配合艾宾浩斯遗忘曲线等各种复习.学习算法和后续会有的娱乐化学习方式,能否真正做到让学过的东西不再忘记. ...

  4. SQL Server 2012 无人值守安装

    方法1,通过指定条个參数安装   setup.exe /Q /IACCEPTSQLSERVERLICENSETERMS /ACTION=install /PID=<validpid> /F ...

  5. Java HashSet介绍

    HashSet底层使用HashMap实现.当使用add方法将对象添加到Set当中时,实际上是将该对象作为底层所维护的Map对象的key,而value则都是同一个Object对象(该对象我们用不上). ...

  6. 胶囊网络 -- Capsule Networks

    胶囊网络是 vector in vector out的结构,最后对每个不同的类别,输出不一个向量,向量的模长表示属于该类别的概率. 例如,在数字识别中,两个数字虽然重叠在一起,Capsule中的两个向 ...

  7. mybatis xml <choose>标签使用

    <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-/ ...

  8. osg塔吊模拟-20191026

    在osg中模拟塔吊群作业

  9. "AttributeError: /lib64/libcrypto.so.1.1: undefined symbol: EVP_CIPHER_CTX_cleanup"

    以前在openssl,有 EVP_CIPHER_CTX_cleanup函数. 1.1.0版本中 替换成为EVP_CIPHER_CTX_reset 解决办法: 找到报错的文件vim /usr/local ...

  10. react——Table组件

    /* * 构建数据列 * */ tableColumns = (currentData) => { let group = lodashGroupBy(currentData, 'level1' ...