Hdu-1565 方格取数(1) (状态压缩dp入门题
方格取数(1)
Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 4702 Accepted Submission(s): 1782
从中取出若干个数,使得随意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,而且取出的数的和最大。
3
75 15 21
75 15 28
34 70 5
188
入门压缩dp,与
Poj - 3254 Corn Fields
类似。
用dp[i][j]表示前i行,第i行选第j种状态时的最优解。
首先找出全部本行不冲突的状态(即这一行中没有相邻的情况),存入state数组
计算出第i行取第j种状态时可得到的数值stn[i][j]
那么dp[i][j]=max{dp[i][j],dp[i-1][k]+stn[i][j]}
(k表示第i-1行取第k种状态
终于答案即为dp[n][j]中的最大值。
代码:
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
const int hpn=18000;
int state[hpn],stn[25][hpn],dp[25][hpn];
//dp[i][j]:前i行,第i行选第j种状态时的最优解
int mst,map[25][25];//第i行选第j种状态时的值 inline int bet(int x,int y)
{
if(x>y) return x;
return y;
} void find_all_state(int n)
{
memset(state,0,sizeof(state));
mst=0;//最多有多少种状态
int lin=(1<<n),index=1;
for(int i=0;i<lin;++i)
{
if((i&(i<<1))==0)
{
state[index]=i;
++mst;
++index;
}
}
} int main()
{
int n;
while(cin>>n)
{
if(n==0)
{
cout<<0<<endl;
continue;
}
find_all_state(n); for(int i=1;i<=n;++i)
{
for(int j=1;j<=n;++j)
{
scanf("%d",&map[i][j]);
}
} memset(stn,0,sizeof(stn));
for(int i=1;i<=n;++i)
{
for(int j=1;j<=mst;++j)
{
int b=n;
for(int t=1;t<(1<<n);t=(t<<1))
{
if((t&state[j])!=0)
{
stn[i][j]+=map[i][b];
}
--b;
}
}
}//统计第i行选第j种状态时可得到的值 memset(dp,0,sizeof(dp));
for(int i=1;i<=mst;++i)//第一行取第i种状态时
{
dp[1][i]=stn[1][i];
}
for(int i=2;i<=n;++i)//对于第i行
{
for(int j=1;j<=mst;++j)//取第j种状态
{
for(int k=1;k<=mst;++k)//第i-1行取第k种状态
{
if((state[j]&state[k])!=0) continue;
dp[i][j]=bet(dp[i][j],dp[i-1][k]+stn[i][j]);
}
}
} int ans=0;
for(int i=1;i<=mst;++i)
{
ans=bet(ans,dp[n][i]);
} cout<<ans<<endl;
}
return 0;
}
Hdu-1565 方格取数(1) (状态压缩dp入门题的更多相关文章
- 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][网络流 - 最大点权独立集和最小点权覆盖集]
题目链接:https://cn.vjudge.net/problem/HDU-1565 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32 ...
- HDU1565 方格取数(1)(状态压缩dp)
题目链接. 分析: 说这题是状态压缩dp,其实不是,怎么说呢,题目数据太水了,所以就过了.手动输入n=20的情况,超时.正解是网络流,不太会. A这题时有个细节错了,是dp[i][j]还是dp[i][ ...
- 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)
HDU 1565 方格取数(1) 给你一个n*n的格子的棋盘,每个格子里面有一个非负数.从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取的数所在的2个格子不能相邻,并且取出的数的 ...
- 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)
方格取数(1) Time Limit: 10000/5000 MS (J ...
- hdu 2167 方格取数 【状压dp】(经典)
<题目链接> 题目大意: 给出一些数字组成的n*n阶矩阵,这些数字都在[10,99]内,并且这个矩阵的 3<=n<=15,从这个矩阵中随机取出一些数字,在取完某个数字后,该数 ...
- 状态压缩DP入门题
. /*本题为状态压缩题 题目大意 : 一个矩阵里有很多格子,每个格子有两种状态,可以放牧和不可以放牧, 可以放牧用1表示,否则用0表示,在这块牧场放牛,要求两个相邻的方 格不能同时放牛(不包括斜着的 ...
- HDU 1565 方格取数(简单状态压缩DP)
http://acm.hdu.edu.cn/showproblem.php?pid=1565 对于每一个数,取或者不取,用0表示不取,1表示取,那么对于每一行的状态,就可以用一个二进制的数来表示.比如 ...
随机推荐
- PDO PDO_MYSQL MYSQLI MYSQL 的区别
MYSQL,MYSQLI 这两个扩展本身就是访问MYSQL数据库的驱动 PDO则是一个抽象层接口 向程序员提供可调用的API是由,MYSQL驱动.MYSQLI驱动,以及PDO来提供. PDO_MYSQ ...
- 树状数组--前n项和;
树状数组是和线段树类似的数据结构,基本上树状数组可以做的线段树都可以做: 树状数组就是一个数组,在信息记录上有一些特点,以动态求前n项和为例:可以改变数组的某一个元素,求前n项和: 数组tree[ i ...
- [TJOI2018] Xor 异或 (可持久化Trie,树链剖分)
题目描述 现在有一颗以 1 为根节点的由 n 个节点组成的树,树上每个节点上都有一个权值 \(v_i\).现在有 Q 次操作,操作如下: 1 x y :查询节点 x 的子树中与 y 异或结果的最大值. ...
- Jvm运行时数据区 —— Java虚拟机结构小记
关于jvm虚拟机的文章网上都讲烂了.尤其是jvm运行时数据区的内容. 抱着眼见为实的想法,自己翻了翻JVM规范,花了点时间稍微梳理了一下. 以下是阅读Java虚拟机规范(Java SE 8版)的第二章 ...
- nginx 变量 + lua
nginx变量使用方法详解(8) nil.null与ngx.null 发现一个nginx LUA开发Web App的框架 nginx是个好东西, nginx的openrtsy发行版本更是个好东西. 今 ...
- uva 10828 高斯消元求数学期望
Back to Kernighan-RitchieInput: Standard Input Output: Standard Output You must have heard the name ...
- FOJ Problem 2261 浪里个浪
...
- 【CF1020A】New Building for SIS(签到)
题意: 有n栋楼,从一栋楼某个地方,到大另一栋楼的某个地方,每栋楼给了连接楼的天桥,每走一层或者穿个一栋楼花费一分钟,求出起点到大目的点最少花费的时间 n,h<=1e8,q<=1e4 思路 ...
- AC日记——Pupils Redistribution Codeforces 779a
A. Pupils Redistribution time limit per test 1 second memory limit per test 256 megabytes input stan ...
- js-控制浏览器和移动端的后退按钮 . popstate
//控制浏览器和移动端的后退按钮 if (window.history && window.history.pushState) { $(window).on('popstate', ...