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)的更多相关文章

  1. luogu P2704 炮兵阵地(经典状态压缩DP)

    方格有m*n个格子,一共有2^(m+n)种排列,很显然不能使用暴力法,因而选用动态规划求解. 求解DP问题一般有3步,即定义出一个状态 求出状态转移方程 再用算法实现.多数DP题难youguan点在于 ...

  2. [知识点]状态压缩DP

    // 此博文为迁移而来,写于2015年7月15日,不代表本人现在的观点与看法.原始地址:http://blog.sina.com.cn/s/blog_6022c4720102w6jf.html 1.前 ...

  3. hoj2662 状态压缩dp

    Pieces Assignment My Tags   (Edit)   Source : zhouguyue   Time limit : 1 sec   Memory limit : 64 M S ...

  4. POJ 3254 Corn Fields(状态压缩DP)

    Corn Fields Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4739   Accepted: 2506 Descr ...

  5. HDU-4529 郑厂长系列故事——N骑士问题 状态压缩DP

    题意:给定一个合法的八皇后棋盘,现在给定1-10个骑士,问这些骑士不能够相互攻击的拜访方式有多少种. 分析:一开始想着搜索写,发现该题和八皇后不同,八皇后每一行只能够摆放一个棋子,因此搜索收敛的很快, ...

  6. DP大作战—状态压缩dp

    题目描述 阿姆斯特朗回旋加速式阿姆斯特朗炮是一种非常厉害的武器,这种武器可以毁灭自身同行同列两个单位范围内的所有其他单位(其实就是十字型),听起来比红警里面的法国巨炮可是厉害多了.现在,零崎要在地图上 ...

  7. 状态压缩dp问题

    问题:Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Ev ...

  8. BZOJ-1226 学校食堂Dining 状态压缩DP

    1226: [SDOI2009]学校食堂Dining Time Limit: 10 Sec Memory Limit: 259 MB Submit: 588 Solved: 360 [Submit][ ...

  9. Marriage Ceremonies(状态压缩dp)

     Marriage Ceremonies Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%lld & %llu ...

  10. HDU 1074 (状态压缩DP)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1074 题目大意:有N个作业(N<=15),每个作业需耗时,有一个截止期限.超期多少天就要扣多少 ...

随机推荐

  1. codevs 1155 金明的预算方案

    时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间金明自己专用的很宽敞的房 ...

  2. 关于在filter中获取WebApplicationContext的实践

    网上很多说法,诸如: <param-name>contextConfigLocation</param-name> <param-value> classpath: ...

  3. 广播接收者 BroadcastReceiver

    1. 分为动态注册和静态注册, 静态注册在清单文件里配置即可.动态创建为代码手动添加. 在锁屏广播中, 使用静态创建消息接受不成功, 原因未知. 动态即可. 代码如下: 2. 创建类, 继承与Broa ...

  4. 快学UiAutomator配置编辑环境

    Java环境配置 1.下载jdk1.6+包 2.安装jdk,默认安装即可 3.成功安装之后,进行测试是否真的成功安装,点击[开始]----[运行]----输入 CMD,在命令提示符里面输入“Java ...

  5. 使用bat脚本调用py文件直接获取应用的包名和targetversion

    背景: 在上一篇已经介绍过如何利用python调用aapt获取包名 https://www.cnblogs.com/reseelei-despair/p/11078750.html 但是因为每次都要修 ...

  6. oracle count 百万级 分页查询记要总数、总条数优化

    oracle count 百万级 分页查询记录总数.总条数优化 oracle count 百万级 查询记录总数.总条数优化 最近做一个项目时,做分页时,发现分页查询速度很慢,分页我做的是两次查询,一次 ...

  7. OC各种遍历方法的效率比较

    看了一篇博客,挺有意思,OC各种遍历方法的效率,打算自己也测试一番.看看,究竟哪一个的效率更好一些! 准备工作:懒加载一个数组,创建一千万个对象添加到数组. #pragma mark - Lazy M ...

  8. vue新手入坑之mounted和created的区别(生命周期)

    这几个月用vue框架新做了一个项目,也算是边学习边实践吧.学习中也看过一些别人的开源项目,起初对mounted和created有一些疑惑,查询相关资料发现,这和vue的生命周期有关,在此也就做一个总结 ...

  9. C++高精度乘法

    #include <cstdio> #include <iostream> #include <algorithm> void highPrecision (int ...

  10. C++系统学习之七:类

    类的基本思想是数据抽象和封装. 数据抽象是一种依赖于接口和实现分离的编程技术.类的接口包括用户所能执行的操作:类的实现包括类的数据成员.负责接口实现的函数体以及定义类所需的各种私有函数. 封装实现了类 ...