【BZOJ1084】最大子矩阵(动态规划)
【BZOJ1084】最大子矩阵(动态规划)
题面
题目描述
这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵不能相互重叠。
输入输出格式
输入格式:
第一行为n,m,k(1≤n≤100,1≤m≤2,1≤k≤10),接下来n行描述矩阵每行中的每个元素的分值(每个元素的分值的绝对值不超过32767)。
输出格式:
只有一行为k个子矩阵分值之和最大为多少。
输入输出样例
输入样例#1
3 2 2
1 -3
2 3
-2 3
输出样例#1
9
题解
还是我太菜
想了半天,发现连数据范围都没有看
\(m≤2\)
。。。
是我太菜,什么都看不见
既然\(m≤2\),那么分情况直接搞就行了
第一种 \(m=1\)
很显然吧。。
设\(f[i][j]\)表示当前搞到第\(i\)行,已经选了\(j\)个子矩阵的最大值
暴力枚举一下上一个开始的位置
然后前缀和转移即可
第二种 \(m=2\)
设\(f[i][j][k]\)表示当前第一列的搞到\(i\),第二列的搞到\(j\),一共选了\(k\)个子矩阵的最大值
首先上下两列分开搞,类似\(m=1\)的转移,
然后当\(i=j\)时,显然可以两列一起转移
所以也类似于\(m=1\)的转移,
求和的时候搞两列的就行了
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
#include<queue>
using namespace std;
inline int read()
{
int x=0,t=1;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=-1,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return x*t;
}
int n,m,g[200][5];
int K,f[101][101][15],s[5][200];
int ff[101][15];
int main()
{
n=read();m=read();K=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
g[i][j]=read();
for(int j=1;j<=m;++j)
for(int i=1;i<=n;++i)
s[j][i]=s[j][i-1]+g[i][j];
if(m==1)
{
memset(ff,-63,sizeof(ff));
ff[0][0]=0;
for(int i=1;i<=n;++i)
{
ff[i][0]=0;
for(int k=1;k<=K;++k)
{
ff[i][k]=ff[i-1][k];//不选
for(int j=0;j<i;++j)
ff[i][k]=max(ff[i][k],ff[j][k-1]+s[1][i]-s[1][j]);
}
}
printf("%d\n",ff[n][K]);
}
else
{
memset(f,-63,sizeof(f));
for(int i=0;i<=n;++i)
for(int j=0;j<=n;++j)
f[i][j][0]=0;
for(int i=1;i<=n;++i)
for(int j=1;j<=n;++j)
{
for(int k=1;k<=K;++k)
{
f[i][j][k]=max(f[i][j][k],f[i-1][j][k]);
f[i][j][k]=max(f[i][j][k],f[i][j-1][k]);
for(int l=0;l<i;++l)
f[i][j][k]=max(f[i][j][k],f[l][j][k-1]+s[1][i]-s[1][l]);
for(int l=0;l<j;++l)
f[i][j][k]=max(f[i][j][k],f[i][l][k-1]+s[2][j]-s[2][l]);
if(i==j)
for(int l=0;l<i;++l)
f[i][j][k]=max(f[i][j][k],f[l][l][k-1]+s[1][i]+s[2][i]-s[1][l]-s[2][l]);
}
}
printf("%d\n",f[n][n][K]);
}
return 0;
}
【BZOJ1084】最大子矩阵(动态规划)的更多相关文章
- BZOJ1084 [SCOI2005]最大子矩阵 动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1084 题意概括 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注 ...
- 九度OJ 1497 面积最大的全1子矩阵 -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1497 题目描述: 在一个M * N的矩阵中,所有的元素只有0和1,从这个矩阵中找出一个面积最大的全1子矩阵,所谓最 ...
- BZOJ 1084 [SCOI2005]最大子矩阵 - 动态规划
传送门 题目大意: 从矩阵中取出k个互不重叠的子矩阵,求最大的和. 题目分析: 对于m=1,直接最大m子段和. 对于m=2: \(dp[i][j][k]\)表示扫描到第一列i和第2列j时选取了k个矩阵 ...
- luogu P2258 子矩阵 |动态规划
题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第22.44行和第22.44.55列交叉 ...
- [SCOI2005]最大子矩阵 (动态规划)
题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k(1≤n≤100,1≤m≤2 ...
- [bzoj1084]最大子矩阵
用f[i][j][k]表示第一行前i个数,第二行前j个数选k个子矩形的答案,考虑转移:1.在第一行/第二行选择一个矩形2.当i=j时,可以选择一个两行的矩形注意要特判m=1的情况 1 #include ...
- [bzoj1084][SCOI2005]最大子矩阵_动态规划_伪·轮廓线dp
最大子矩阵 bzoj-1084 SCOI-2005 题目大意:给定一个n*m的矩阵,请你选出k个互不重叠的子矩阵使得它们的权值和最大. 注释:$1\le n \le 100$,$1\le m\le 2 ...
- 【动态规划】最大连续子序列和,最大子矩阵和,最大m子段和
1.最大字段和问题 求一个序列最大连续子序列之和. 例如序列[-1,-2,-3,4,5,-6]的最大子段和为4 + 5 = 9. ①枚举法 int MaxSum(int n,int *a){ int ...
- 【动态规划】最大子段和问题,最大子矩阵和问题,最大m子段和问题
http://blog.csdn.net/liufeng_king/article/details/8632430 1.最大子段和问题 问题定义:对于给定序列a1,a2,a3……an,寻找它 ...
随机推荐
- 超级简便的容器化部署工具(使用 ASP.NET Core 演示)
Docker 改变了我们部署网站的方式,从原先的手动编译打包上传,到现在的构建镜像然后推送部署,让我们在配置环境上所花费的时间大大减少了.不仅如此,通过一系列相关的工具配合,可以很轻松的实现 CI.C ...
- MathJax使用指南
MathJax使用指南 SublimePrettyJson Github CSDN-Markdown语法集锦 LaTex 简明教程 在Markdown中输入数学公式(MathJax) MathJax ...
- 哪些CSS是可以被继承的--简单整理
那些CSS是可以被继承的--简单整理1.文本相关属性是继承的:font-size,font-family,line-height,text-index等2.列表相关属性是继承的:list-style- ...
- [Uva10601]Cubes
[Uva10601]Cubes 标签: 置换 burnside引理 题意 给你12跟长度相同的小木棍,每个小木棍有一个颜色.统计他们能拼成多少种不同的立方体.旋转后相同的立方体认为是相同的. 题解 这 ...
- Linux一些常用操作
1.linux swap分区 可采用文件的方式 dd if=/dev/zero of=/var/swap bs=1024 count=2048000 mkswap /var/swap swapon / ...
- wamp server环境下mysql数据库的密码为什么修改不了?
每次这个控制台,不输入密码可以直接用,用root登录都登录不了.修改root密码也修改不了.困惑? 经过不断的尝试终于找到解决的办法: 1,在mysql的配置文件my.ini的末尾添加 skip-gr ...
- 高并发关于微博、秒杀抢单等应用场景在PHP环境下结合Redis队列延迟入库
第一步:创建模拟数据表. CREATE TABLE `test_table` ( `id` int(11) NOT NULL AUTO_INCREMENT, `uid` int(11) NOT NUL ...
- Windows下使用Sublime text3快速编辑Linux文件,写Shell
所需要配合的工具是WinSCP 添加完毕之后直接在目录下双击要编辑的shell脚本文件,即可弹出Sublime Text的编辑器 然后咱通过Putty看看Linux虚拟机上的文件有没有发生变化
- 关于Devexpress15.2中GridControl控件选择字段ColumnEdit下拉时间设置
效果:点击表格GridControl控件中的列,可以显示日期和时间.时间可以手动修改.(绑定日期格式的字段) 设置步骤:1.点击时间字段列表设置ColumnEdit-New-选择DateEdit出现r ...
- 2018/3/2晚11点30分写的程序(C++)
程序目标:输入一个字符串,竖向输出该字符串.使用string和动态分配内存机制.代码如下: #include<iostream>#include "stdafx.h"# ...