P2258 子矩阵——搜索+dp
二进制枚举套二进制枚举能过多一半的点;
我们只需要优化一下第二个二进制枚举的部分;
首先我们先枚举选哪几行,再预处理我们需要的差值,上下,左右;
sum_shang,sum_heng
然后DP查找最小值
dp[i][j]表示前i列已经选了j列;
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
int n,m,r,c;
int a[maxn][maxn];
int id[maxn];
int b[maxn];
int sum_s[maxn];
int sum_h[maxn][maxn]; void pre_pare()
{
memset(sum_s,,sizeof(sum_s));
int num=;
for(int i=;i<=n;i++) if(b[i]) id[++num]=i;
for(int i=;i<r;i++)
{
for(int j=;j<=m;j++)
{
sum_s[j]+=abs(a[id[i]][j]-a[id[i+]][j]);
}
} for(int i=;i<=m;i++)
{
for(int j=i+;j<=m;j++)
{
sum_h[i][j]=;
for(int k=;k<=r;k++)
{
sum_h[i][j]+=abs(a[id[k]][i]-a[id[k]][j]);
}
}
} } int ans=,res=;
int dp[maxn][maxn]; int query()
{
memset(dp,0x3f,sizeof(dp));
res=;
for(int i=;i<=m;i++)
{
dp[i][]=sum_s[i];
for(int j=;j<=c;j++)
{
for(int k=;k<i;k++)
{
dp[i][j]=min(dp[i][j],dp[k][j-]+sum_s[i]+sum_h[k][i]);
}
}
res=min(res,dp[i][c]);
}
return res;
} void dfs(int x,int sum)
{
if(sum>r) return ;
if(x==n+)
{
if(sum!=r) return ;
pre_pare();
ans=min(ans,query());
return ;
}
b[x]=;
dfs(x+,sum);
b[x]=;
dfs(x+,sum+);
}
int main()
{
scanf("%d%d%d%d",&n,&m,&r,&c);
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
}
dfs(,);
printf("%d",ans);
return ;
}
P2258 子矩阵——搜索+dp的更多相关文章
- P2258 子矩阵 (搜索,动态规划)
题目链接 Solution 搜索+DP. 刚好把搜索卡死的数据范围... 然后应该可以很容易想到枚举行的情况,然后分列去DP. 行的情况直接全排列即可,复杂度最高 \(O(C_{16}^{8})\). ...
- P2258 子矩阵(dp)
P2258 子矩阵 题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4 ...
- 洛谷 P2258 子矩阵 解题报告
P2258 子矩阵 题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第 2 . 4行和第 ...
- 洛谷P2258 子矩阵
P2258 子矩阵 题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4 ...
- 记忆化搜索(DP+DFS) URAL 1183 Brackets Sequence
题目传送门 /* 记忆化搜索(DP+DFS):dp[i][j] 表示第i到第j个字符,最少要加多少个括号 dp[x][x] = 1 一定要加一个括号:dp[x][y] = 0, x > y; 当 ...
- [洛谷P2258][NOIP2014PJ]子矩阵(dfs)(dp)
NOIP 2014普及组 T4(话说一道PJ组的题就把我卡了一个多小时诶) 这道题在我看第一次的时候是没有意识到这是一道DP题的,然后就摁着DFS敲了好长时间,结果敲了一个TLE 这是DP!!! 下面 ...
- NOIP2014pj子矩阵[搜索|DP]
题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4.5列交叉位置的元素 ...
- 【Luogu】P2258子矩阵(状态压缩,DP)
233今天蒟蒻我连文化课都没听光想着这个了 然后我调了一下午终于过了!!! 一看数据范围似乎是状压,然而216等于65536.开一个65536*65536的二维数组似乎不太现实. 所以Rqy在四月还是 ...
- 洛谷 P2258 子矩阵
题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第2.4行和第2.4.5列交叉位置的元素 ...
随机推荐
- Core 导出(流和URL两种)
1.流 2.URL 两种都是使用Epplus 1. EPPlus的基本介绍 EPPlus是一个使用Open Office XML(xlsx)文件格式,能读写Excel 2007/2010 文件的开源组 ...
- OpenWrt 中查看 Flash RAM CPU 信息
OpenWrt 中查看 Flash RAM CPU 信息 来源 https://blog.csdn.net/mcusun2000/article/details/51130434 硬件: QCA95 ...
- MySql注释的写法
每一种语言都有它的注释方式,代码量少的时候还可以,随着代码量越来越多,代码注释的重要性也越发凸显. 在mysql中主要有三种方式: 1.常用的方式,跟在css中那些注释一样 :/* 内容 */ /* ...
- redux的理解
Redux 这里介绍下我对Redux的理解,不涉及如何使用Redux. Redux 官网介绍: A predictable state container for JavaScript apps.(一 ...
- 一些 SQLite技巧
SQLite自增ID自段 使用方法为 INTEGER PRIMARY KEY AUTOINCREMENT 如: CREATE TABLE 21andy ( id INTEGER PRIMA ...
- docker-compose设置mysql初始化数据库的字符集
version: '3' services: mysql: image: mysql:5.7.24# volumes:# - ./mysqld.cnf:/etc/mysql/mysql.conf.d/ ...
- IDEA快速搭建WEB项目【记录篇】
这里用的都是市面上通用的技术,而每个公司都有自己的调用方式,可以根据实际情况与业务场景不同去进行变通 三层架构: 界面层(User Interface layer).业务逻辑层(Business Lo ...
- Python语言之requests库
发送请求.传递URL参数.定制headers.接受数据,处理数据等 在Java中用httpclient jar包,在Python中用requests库,即使没有事先下载,在Pycharm开发工具中,出 ...
- 常见的监控JVM的几个Linux命令和使用
jps [root@xxx bin]# jps -l 2007bash: jps: command not found [root@xxx bin]# /opt/jdk1.8.0_181/bin/jp ...
- PAT-2019年冬季考试-乙级(题解)
很荣幸这次能够参加乙级考试,和大佬们同台竞技了一次,这篇博客,进行介绍这次2019冬季的乙级考试题解. 7-1 2019数列 (15分) 把 2019 各个数位上的数字 2.0.1.9 作为一个数列的 ...