HDU 1565 方格取数 状压dp
题目:
从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的和最大。
Input
包括多个测试实例,每个测试实例包括一个整数n 和n*n个非负数(n<=20)Output对于每个测试实例,输出可能取得的最大的和
Sample Input
- 3
- 75 15 21
- 75 15 28
- 34 70 5
Sample Output
- 188
题解:
一看数据范围才20,再看一下题面基本上就是状态dp了
这道题和POJ 1185 炮兵阵地 状压dp 差不多,还比它简单
就套一下状压dp模板就行
首先就找一下可行状态(这个题目的可行状态就是两个相邻位置不能同时出现1)
然后dp[i][j]就表示:截至到第i行,第i行的状态为j,能找出来的数的最大和
转移方程就是枚举上一行的状态,加上i行上j状态所得到的数的和就可以了
没什么好说的,板子
- #include<stdio.h>
- #include<string.h>
- #include<algorithm>
- #include<iostream>
- using namespace std;
- #define mem(a) memset(a,0,sizeof(a))
- typedef long long ll;
- const int maxn=21;
- const int N=18000;
- const int INF=1e9;
- ll v[maxn][maxn],state[N],dp[maxn][N];
- int main()
- {
- ll n;
- while(~scanf("%lld",&n))
- {
- ll num=0;
- mem(dp);
- for(ll i=0; i<n; ++i)
- {
- for(ll j=0; j<n; ++j)
- {
- scanf("%lld",&v[i][j]);
- }
- }
- //ll m;
- for(ll i=0; i<(1<<n); ++i)
- {
- if(i&(i<<1)) continue;
- //m=i;
- state[num]=i;
- // ll k=i,x=0;
- // while(k)
- // {
- // if(k&1) num_1[num]+=v[];
- // x+=1;
- // k>>=1;
- // }
- num++;
- }
- // printf("%lld****\n",num);
- // system("pause");
- for(ll i=0; i<num; ++i)
- {
- ll value=0;
- for(ll j=0; j<n; ++j)
- {
- if(state[i]&(1<<j))
- value+=v[0][j];
- }
- dp[0][i]=value;
- }
- for(ll i=1; i<n; ++i)
- {
- for(ll j=0; j<num; ++j)
- {
- ll k=state[j],x=0,value=0;
- while(k)
- {
- if(k&1) value+=v[i][x];
- x+=1;
- k>>=1;
- }
- for(ll kk=0; kk<num; ++kk)
- {
- if(state[kk]&state[j]) continue;
- dp[i][j]=max(dp[i][j],dp[i-1][kk]+value);
- }
- }
- }
- ll maxx=0;
- for(ll i=0;i<num;++i)
- {
- maxx=max(maxx,dp[n-1][i]);
- }
- printf("%lld\n",maxx);
- }
- return 0;
- }
HDU 1565 方格取数 状压dp的更多相关文章
- HDU 1565 方格取数(1) 轮廓线dp
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1565 方格取数(1) Time Limit: 10000/5000 MS (Java/Others) ...
- HDU 1565 方格取数(1) ——插头DP
[题目分析] 其实直接状压就可以了. 但是有点闲,又写了一个可读性极差,智商低下,很(gou)好(pi)的代码 [代码] #include <cstdio> #include <cs ...
- 方格取数--状压DP or 网络流
题意:http://acm.hdu.edu.cn/showproblem.php?pid=1565 取不相邻的点是权值最大. 这题可以网络流做,暂时先DP一下,网络流明天学一下~~ #define I ...
- 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)
HDU 1565 方格取数(1) 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的 ...
- HDU 1565 - 方格取数(1) - [状压DP][网络流 - 最大点权独立集和最小点权覆盖集]
题目链接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32 ...
- hdu 1565 方格取数(1) 状态压缩dp
方格取数(1) Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Su ...
- hdu 1565 方格取数(1)(状态压缩dp)
方格取数(1) Time Limit: 10000/5000 MS (J ...
- HDU 1565 方格取数(简单状态压缩DP)
http://acm.hdu.edu.cn/showproblem.php?pid=1565 对于每一个数,取或者不取,用0表示不取,1表示取,那么对于每一行的状态,就可以用一个二进制的数来表示.比如 ...
- HDU 1565 方格取数(1)(最大点权独立集)
http://acm.hdu.edu.cn/showproblem.php?pid=1565 题意: 给你一个n*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格 ...
随机推荐
- 深入汇编指令理解Java关键字volatile
volatile是什么 volatile关键字是Java提供的一种轻量级同步机制.它能够保证可见性和有序性,但是不能保证原子性 可见性 对于volatile的可见性,先看看这段代码的执行 flag默认 ...
- 史上最全postgreSQL体系结构(转)
原文链接:https://cloud.tencent.com/developer/article/1469101 墨墨导读:本文主要从日志文件.参数文件.控制文件.数据文件.redo日志(WAL).后 ...
- MySQL简介及安装 mysql Ver 14.14 Distrib 5.7.28
1.MySQL简介 1.数据库产品演变 第一代数据库架构: RDBMS 关系型数据库时代 : 合的时代 代表产品 :Oracle .MSSQL .MySQL.SQL server 第二代数据库架构:拆 ...
- SQL Server 2012 忘记sa用户处理方法
SQL Server 2012 忘记sa用户的密码,可重置sa密码,方法如下: 1.将身份验证改成Windows身份验证,登录进去 2.进入SQL Server控制台,在对象资源管理器中找到Secur ...
- Python小度
这只是一个对话器!还不能听歌(反正我也没在UNIT平台配置听歌的功能)! 反正最近也不知怎么的,就想做一个AI对话器语音识别和语音输出都不要,input()和print()就行本来准备用小爱的,但要实 ...
- (03)-Python3之--元组(tuple)操作
1.定义 元组的关键字:tuple 元组以()括起来,数据之间用 , 隔开.元组当中的数据,可以是任意类型.数值是可以重复的. 元组元素是 不可变的,顺序是 有序的. 例如: b = ("萝 ...
- Correct the classpath of your application so that it contains a single, compatible version of org.thymeleaf.spring5.SpringTemplateEngine
Error starting ApplicationContext. To display the conditions report re-run your application with 'de ...
- 【C++小知识】#define、enum、const的含义与用法
一.#define 含义 define是宏定义,编译器不对其进行错误检查,在预编译阶段处理,没有作用域限制属于全局常量,在程序中编译器会对定义的常量名以数值进行替换,且每次替换都分配内存,此方法对于大 ...
- python 9学习 高级特性
高级特性 掌握了Python的数据类型. 语句 和函数,基本上就可以编写出很多有用的程序了. 比如构造一个1, 3, 5, 7, ..., 99的列表,可以通过循环实现: L = [] n ...
- Java SPI 与 Dubbo SPI
SPI(Service Provider Interface)是JDK内置的一种服务提供发现机制.本质是将接口实现类的全限定名配置在文件中,并由服务加载器读取配置文件,加载实现类.这样可以在运行时,动 ...