【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】最大子矩阵(动态规划)的更多相关文章

  1. BZOJ1084 [SCOI2005]最大子矩阵 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1084 题意概括 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注 ...

  2. 九度OJ 1497 面积最大的全1子矩阵 -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1497 题目描述: 在一个M * N的矩阵中,所有的元素只有0和1,从这个矩阵中找出一个面积最大的全1子矩阵,所谓最 ...

  3. BZOJ 1084 [SCOI2005]最大子矩阵 - 动态规划

    传送门 题目大意: 从矩阵中取出k个互不重叠的子矩阵,求最大的和. 题目分析: 对于m=1,直接最大m子段和. 对于m=2: \(dp[i][j][k]\)表示扫描到第一列i和第2列j时选取了k个矩阵 ...

  4. luogu P2258 子矩阵 |动态规划

    题目描述 给出如下定义: 子矩阵:从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵(保持行与列的相对顺序)被称为原矩阵的一个子矩阵. 例如,下面左图中选取第22.44行和第22.44.55列交叉 ...

  5. [SCOI2005]最大子矩阵 (动态规划)

    题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k(1≤n≤100,1≤m≤2 ...

  6. [bzoj1084]最大子矩阵

    用f[i][j][k]表示第一行前i个数,第二行前j个数选k个子矩形的答案,考虑转移:1.在第一行/第二行选择一个矩形2.当i=j时,可以选择一个两行的矩形注意要特判m=1的情况 1 #include ...

  7. [bzoj1084][SCOI2005]最大子矩阵_动态规划_伪·轮廓线dp

    最大子矩阵 bzoj-1084 SCOI-2005 题目大意:给定一个n*m的矩阵,请你选出k个互不重叠的子矩阵使得它们的权值和最大. 注释:$1\le n \le 100$,$1\le m\le 2 ...

  8. 【动态规划】最大连续子序列和,最大子矩阵和,最大m子段和

    1.最大字段和问题 求一个序列最大连续子序列之和. 例如序列[-1,-2,-3,4,5,-6]的最大子段和为4 + 5 = 9. ①枚举法 int MaxSum(int n,int *a){ int ...

  9. 【动态规划】最大子段和问题,最大子矩阵和问题,最大m子段和问题

    http://blog.csdn.net/liufeng_king/article/details/8632430 1.最大子段和问题      问题定义:对于给定序列a1,a2,a3……an,寻找它 ...

随机推荐

  1. Linux下jdk环境配置

    1.下载jdk http://www.oracle.com/technetwork/java/javase/downloads/index.html 我选择64位的版本 jdk-8u121-linux ...

  2. 如何在Python中从零开始实现随机森林

    欢迎大家前往云+社区,获取更多腾讯海量技术实践干货哦~ 决策树可能会受到高度变异的影响,使得结果对所使用的特定测试数据而言变得脆弱. 根据您的测试数据样本构建多个模型(称为套袋)可以减少这种差异,但是 ...

  3. Git 如何 clone 非 master 分支的代码

    问题描述 我们每次使用命令 git clone git@gitlab.xxx.com:xxxxx.git 默认 clone 的是这个仓库的 master 分支.如果最新的代码不在 master 分支上 ...

  4. Nginx调用远程php-fpm

    在Nginx服务器的情况下,当我们输入 http://localhost:8080/index.php回车的时候 浏览器会将请求发送给Nginx,Nginx会根据我们所配置的以.php结尾的PHP的文 ...

  5. 硬件能力与智能AI-Zoomla!逐浪CMS2 x3.9.2正式发布

    北京时间2017年9月10日,领先的CMS网站内容管理系统与生产力软件研发厂商-Zoomla!逐浪CMS团队发布其年度重要产品:Zoomla!逐浪CMS2 x3.9.2,引领国内门户.移动.微商以及生 ...

  6. 1.2 Python开发环境

    1.2.1 百家争鸣的繁荣景象 工欲善其事,必先利其器.学习编程也是同样的道理,熟悉开发环境应该是学习一门编程语言的第一步. IDLE是Python的官方标准开发环境,从官网www.python.or ...

  7. mex (离散化+线段树)

    Time Limit: 3000 ms   Memory Limit: 256 MB Description 给你一个无限长的数组,初始的时候都为0,有3种操作: 操作1是把给定区间$[l,r]$设为 ...

  8. shell脚本中 杀死可能成为僵尸进程的方法

    交互式 Bash Shell 获取进程 pid 在已知进程名(name)的前提下,交互式 Shell 获取进程 pid 有很多种方法,典型的通过 grep 获取 pid 的方法为(这里添加 -v gr ...

  9. 开发工具类API调用的代码示例合集:六位图片验证码生成、四位图片验证码生成、简单验证码识别等

    以下示例代码适用于 www.apishop.net 网站下的API,使用本文提及的接口调用代码示例前,您需要先申请相应的API服务. 六位图片验证码生成:包括纯数字.小写字母.大写字母.大小写混合.数 ...

  10. $_SERVER变量

    $_SERVER is an array containing information such as headers, paths, and script locations. The entrie ...