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列交叉位置的元素 ...
随机推荐
- js将文字填充与canvas画布再转为图片
需求:封装consul服务的webUI: 原因:展示consul的服务信息时,需要嵌套动画,由于其没有内置的icon,所以将服务name放于图片位: 分析:展示信息时采用了卡片式的服务布局,缩放式的服 ...
- .Net MVC 输出HTML内容
1.后台代码中的带HTML标记的内容 ViewData["msg"]="<b>Title</b>"; 然则如许打印出来的就是 <b ...
- oracel 查询语句
1.以左边为显示表,从其他表查询关联的数据(多表查询) select a.*,b.name from da as a left join db as b on a.id = b.pid left jo ...
- Java开发环境搭建(一)
一.JDK与JRE JDK:Java Development Kit,Java开发工具包,是给开发人员使用的,其中包含了Java的开发工具,如java.javac.jar等命令,同时也包含了JRE. ...
- spring boot 简要常用配置
# 激活开发环境 spring.profiles.active=dev spring.mvc.date-format=yyyy-MM-dd HH:mm:ss spring.http.encoding. ...
- [转]数据库性能优化(老Key)
数据库性能优化一:数据库自身优化(大数据量) https://www.cnblogs.com/AK2012/archive/2012/12/25/2012-1228.html 数据库性能优化二:数据库 ...
- linux删除命令的简单查找使用--临时找来用的
---恢复内容开始--- linux删除某个文件:rm -f filename; mysql清空数据库,并且主键回到1:TRUNCATE TABLE tablename: drop tab ...
- LFS7.10——准备Host系统
转载请标明出处:https://www.cnblogs.com/kelamoyujuzhen/articles/9161515.html 实验环境: Host:Windows10 + WMWare W ...
- 用js刷剑指offer(第一个只出现一次的字符)
题目描述 在一个字符串(0<=字符串长度<=10000,全部由字母组成)中找到第一个只出现一次的字符,并返回它的位置, 如果没有则返回 -1(需要区分大小写). 牛客网链接 js代码 fu ...
- CDH6.2离线安装(整理版)
1.概述 CDH,全称Cloudera's Distribution, including Apache Hadoop.是Hadoop众多分支中对应中的一种,由Cloudera维护,基于稳定版本的Ap ...