【Luogu】P2258子矩阵(状态压缩,DP)
233今天蒟蒻我连文化课都没听光想着这个了
然后我调了一下午终于过了!!!
一看数据范围似乎是状压,然而216等于65536。开一个65536*65536的二维数组似乎不太现实。
所以Rqy在四月还是几月给我们讲这道题的时候说要半DFS半DP,时间复杂度O(2n*n3)
怎么个半DFS半DP法呢?
其实我没DFS。所以这个问题不重要。
我真的没用DFS。枚举从1到2n-1的所有集合,把二进制数中1的个数不等于r的都筛掉。然后对于每个状态,预处理出每一列内部的代价,预处理出列与列之间的代价,然后进行DP。
那DP状态怎么设计呢?
我们设f[i][j]表示考虑前i列,选择j列,且必须选择第i列的最小代价。则转移方程为f[i][j]=min(f[i][j],f[k][j-1]+第i列内部代价+第k列和第i列之间的代价) 1<=k<j
所以必须选择第i列的道理就是转移方程好设计。如果没有这个限制,可能你在算第k列和第i列之间的代价的时候第k列根本没被选上,结果就WA。
最后ans=min(ans,f[i][c]) 1<=i<=m
代码如下
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cctype>
#define Max ((1<<n)-1)
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
}
inline long long min(long long a,long long b){ return a<b?a:b; }
int que[][];
int f[][];
int d[],w[][];
bool s[];
int ans=0x7fffffff;
inline int count(int x){
int ans=;
while(x){
x&=(x-);
ans++;
}
return ans;
} int main(){
int n=read(),m=read(),r=read(),c=read();
for(int i=;i<=n;++i)
for(int j=;j<=m;++j) que[i][j]=read();
for(int i=;i<=Max;++i){
if(count(i)!=r) continue;
memset(d,,sizeof(d));
memset(f,/,sizeof(f));
memset(w,,sizeof(w));
int x=i;
for(int j=;j<=n;++j){
s[j]=x&;
x>>=;
}
for(int j=;j<=m;++j)
for(int k=;k<=n;++k)
if(s[k]){
for(int u=;u<j;++u)
w[j][u]+=std::abs(que[k][j]-que[k][u]);
int l=k-;
while(!s[l]&&l) l--;
if(!l) continue;
d[j]+=std::abs(que[k][j]-que[l][j]);
}
for(int j=;j<=m;++j){
f[j][]=;
f[j][]=d[j];
}
for(int j=;j<=m;++j)
for(int k=;k<=j&&k<=c;++k){
for(int l=;l<j;++l){
if(f[j][k-]==f[][]) continue;
f[j][k]=min(f[j][k],f[l][k-]+w[j][l]+d[j]);
}
}
for(int j=c;j<=m;++j) ans=min(ans,f[j][c]);
}
printf("%d",ans);
return ;
}
【Luogu】P2258子矩阵(状态压缩,DP)的更多相关文章
- luogu P2704 炮兵阵地(经典状态压缩DP)
方格有m*n个格子,一共有2^(m+n)种排列,很显然不能使用暴力法,因而选用动态规划求解. 求解DP问题一般有3步,即定义出一个状态 求出状态转移方程 再用算法实现.多数DP题难youguan点在于 ...
- [知识点]状态压缩DP
// 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...
- hoj2662 状态压缩dp
Pieces Assignment My Tags (Edit) Source : zhouguyue Time limit : 1 sec Memory limit : 64 M S ...
- POJ 3254 Corn Fields(状态压缩DP)
Corn Fields Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 4739 Accepted: 2506 Descr ...
- HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP
题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...
- DP大作战—状态压缩dp
题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...
- 状态压缩dp问题
问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...
- BZOJ-1226 学校食堂Dining 状态压缩DP
1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MB Submit: 588 Solved: 360 [Submit][ ...
- Marriage Ceremonies(状态压缩dp)
Marriage Ceremonies Time Limit:2000MS Memory Limit:32768KB 64bit IO Format:%lld & %llu ...
- HDU 1074 (状态压缩DP)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...
随机推荐
- UIView动画效果之----翻转.旋转.偏移.翻页.缩放.取反的动画效
翻转的动画 //开始动画 [UIView beginAnimations:@"doflip" context:nil]; //设置时常 [UIView setAnimationDu ...
- 中国区 Azure 应用程序开发说明
1.文档简介 微软公司为其在境外由微软运营的 Azure 服务(以下简称为 “境外 Azure”),创建和部署云应用程序,提供了相应工具. 在中国,由世纪互联运营的 Microsoft Azure ( ...
- 微信程序开发系列教程(三)使用微信API给微信用户发文本消息
这个系列的第二篇教程,介绍的实际是被动方式给微信用户发文本消息,即微信用户关注您的公众号时,微信平台将这个关注事件通过一个HTTP post发送到您的微信消息服务器上.您对这个post请求做了应答(格 ...
- kitti raw data development kit的使用
run_demoVelodyne.m使用:http://blog.csdn.net/qq_33801763/article/details/78959205 https://www.cnblogs ...
- ios之NSNumber
NSNumber + (NSNumber *)numberWithInt:(int)value; + (NSNumber *)numberWithDouble:(double)value; - (in ...
- 【技巧:字符串同构】Avendesora
判断字符串“同构”的技巧 题目大意 给定A,B两个序列,要求B在A中出现的次数以及位置.定义字符变换:把所有相同的字符变为另一种字符:两个字符串相等:当且仅当一个字符串可以在若干次字符变换之后变为另一 ...
- 【dp 贪心】bzoj4391: [Usaco2015 dec]High Card Low Card
巧妙的贪心 Description Bessie the cow is a huge fan of card games, which is quite surprising, given her l ...
- [LUOGU] P3128 [USACO15DEC]最大流Max Flow
题意:一棵树,多次给指定链上的节点加1,问最大节点权值 n个点,n-1条边很容易惯性想成一条链,幸好有样例.. 简单的树剖即可!(划去) 正常思路是树上差分,毕竟它就询问一次.. #include&l ...
- 【Java_基础】cmd下使用java命令运行class文件提示“错误:找不到或无法加载主类“的问题分析
1.问题如下 当在命令行使用java命令执行字节码文件时提示“错误:找不到或无法加载主类” 2. 问题分析 这是由于在运行时类的全名应该是包名+类名,例如在包net.xsoftlab.baike下的类 ...
- 使用dmidecode在Linux下获取硬件信息
dmidecode命令可以让你在Linux系统下获取有关硬件方面的信息.dmidecode的作用是将DMI数据库中的信息解码,以可读的文本方式显示.由于DMI信息可以人为修改,因此里面的信息不一定是系 ...