[luoguP2331] [SCOI2005]最大子矩阵(DP)

传送门

 

orz不会做。。。

 

一个好理解的做法(n^3*k):

分n=1和n=2两种情况考虑。

n=1时,预处理出前缀和sum[]。

设f[i][j]为到达第i格,已经放了j个子矩阵的最大和,

那么每次先把f[i][j]的值设为f[i-1][j](第i个元素不属于第j个子矩阵)

剩下的情况就是第i个元素属于第j个子矩阵了。

这时候用max(f[h-1][j-1]+(sum[i]-sum[h-1]), 1<=h<=i)更新f[i][j]的最大值,即枚举第j个子矩阵的起始点。

最终答案为f[m][k]。(边界条件为f[0][j]=0,包含空矩阵)

n=2时,预处理出分别列的前缀和sum1[],sum2[]。

设f[i][j][l]为在第1列到达第i格,第2列到达第j格,已经放了l个子矩阵的最大和,

那么每次先把f[i][j][l]的值设为max(f[i-1][j][l],f[i][j-1][l])(第i行第1列不属于子矩阵或第j行第2列不属于子矩阵,两者取较大值)

剩下的情况就是第i行第1列和第j行第2列都属于子矩阵了。

分两种情况:

一、第i行第1列和第j行第2列属于不同的子矩阵

分别枚举第i行第1列所在子矩阵的起始点和第j行第2列所在子矩阵的起始点并更新答案,

即用max(f[h-1][j][l-1]+(sum1[i]-sum1[h-1]), 1<=h<=i)和max(f[i][h-1][l-1]+(sum2[j]-sum2[h-1]),1<=h<=j)更新f[i][j]的最大值。

二、第i行第1列和第j行第2列属于同一子矩阵

仅当i==j时才包含这种情况(因为i和j要作为当前状态中子矩阵的末尾)。这时候这个子矩阵的列数必定为2。

还是一样枚举子矩阵的起始点,

在i==j的条件下用max(f[h-1][h-1][l-1]+(sum1[i]-sum1[h-1])+(sum2[j]-sum2[h-1]),1<=h<=i)更新答案。

最后答案为f[m][m][k](边界条件为f[0][0][l]=0,包含空矩阵)

 

#include <cstdio>
#define M 15
#define N 105 
#define max(x, y) ((x) > (y) ? (x) : (y))int n, m, K;
int sum[N][M];
int f[N][N][M], f0[N][M];int main()
{int i, j, k, l, x;scanf("%d %d %d", &n, &m, &K);for(i = 1; i <= n; i++)for(j = 1; j <= m; j++){scanf("%d", &x);sum[i][j] = sum[i - 1][j] + x;}if(m == 1){for(i = 1; i <= n; i++)for(j = 1; j <= K; j++){f0[i][j] = f0[i - 1][j];for(k = 1; k <= i; k++)f0[i][j] = max(f0[i][j], f0[k - 1][j - 1] + sum[i][1] - sum[k - 1][1]);}printf("%d\n", f0[n][K]);return 0;}for(i = 1; i <= n; i++)for(j = 1; j <= n; j++)for(k = 1; k <= K; k++){f[i][j][k] = max(f[i - 1][j][k], f[i][j - 1][k]);for(l = 1; l <= i; l++)f[i][j][k] = max(f[i][j][k], f[l - 1][j][k - 1] + sum[i][1] - sum[l - 1][1]);for(l = 1; l <= j; l++)f[i][j][k] = max(f[i][j][k], f[i][l - 1][k - 1] + sum[j][2] - sum[l - 1][2]);if(i == j)for(l = 1; l <= i; l++)f[i][i][k] = max(f[i][i][k], f[l - 1][l - 1][k - 1] + sum[i][1] - sum[l - 1][1] + sum[i][2] - sum[l - 1][2]);}printf("%d\n", f[n][n][K]);return 0;
}

  
还看到一个比较神的nk做法

O(Nk)时间复杂度0ms过

只有一列的不用说吧,我说下两列的

考虑每一行的状态

0 空出这一行

1 选择左边空出右边

2 选择右边空出左边

3 选择这一行两个(不作为一个矩阵,而是左边一列单独一个矩阵,右边单独一个矩阵)

4 选择这一行两个(两个一块作为一个矩阵的一部分)

定义f[i,j,k]为当前处理到第i行,已经选了j个矩阵,当前行状态为k的最大值(k为上面的0-4种状态)

如果空出这一行,则j不需要变化,直接继承上一行的各种状态的最大值

f[i][j][0]=max(f[i-1][j][0],f[i-1][j][1],f[i-1][j][2],f[i-1][j][3],f[i-1][j][4]);

如果选择左边空出右边,如果上一行的左边没有单独地选择成为矩阵的话(即选择1或3),则j需要包含新选择成为的矩阵(即这一行的左边的这个矩阵),

如果上一行为同时选择两列的为一个矩阵的状态,则只选择单独的左边是不能包含进去上一行的矩阵的,所以也应j-1(t1为这一行左边的值)

f[i][j][1]=max(f[i-1][j-1][0],f[i-1][j][1],f[i-1][j-1][2],f[i-1][j][3], f[i-1][j-1][4])+t1;

右边同理(t2为这一行右边的值)

f[i][j][2]=max(f[i-1][j-1][0],f[i-1][j-1][1],f[i-1][j][2],f[i-1][j][3], f[i-1][j-1][4])+t2;

选择两个分别单独作为矩阵,类似只选择左边或右边,不过是单独选左边和右边合并了下

f[i][j][3]=max(f[i-1][j-1][1],f[i-1][j-1][2],f[i-1][j][3])+t1+t2;

if(j>=2) f[i][j][3]=max(f[i][j][3],f[i-1][j-2][4]+t1+t2);

选择两个作为一个矩阵,则上一行除了可以接上的,都得j-1

f[i][j][4]=max(f[i-1][j-1][0],f[i-1][j-1][1],f[i-1][j-1][2],f[i-1][j-1][3],f[i-1][j][4])+t1+t2;

转载于:https://www.cnblogs.com/zhenghaotian/p/7608166.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/251774.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

想要去阿里面试?你必须得跨过 JVM 这道坎!

概述 很多人想要到阿里巴巴、美团、京东等互联网大公司去面试&#xff0c;但是现在互联网大厂面试一般都必定会考核JVM相关的知识积累和实践经验&#xff0c;毕竟线上系统写好代码部署之后&#xff0c;每个工程师都必须关注JVM相关的东西&#xff0c;比如OOM、GC等问题. 所以一…

医学知识图谱一

大纲 知识自动提取技术 医学知识融合 医学知识推理 转载于:https://www.cnblogs.com/quietwalk/p/9000950.html

在一个div里,列表样式图片进行float,实现水平排序

<div class"xiangce"><ul> <li><a href"#"><img src"images/pic4.gif" alt"">产品名称</a></li><li><a href"#"><img src"images/pic4.gif" alt"…

团队开发git使用各种问题

参考:https://www.cnblogs.com/schaepher/p/4933873.html 问题-3:保持github上项目干净&#xff0c;对于在不同机器上运行会不同的文件不予维护(如.idea/workspace.xml) 建议:对于项目输出在项目目录中的文件不予维护 对于IDE自动生成且与项目所在目录有关的文件不予维护 将这些…

filebeat 乱码

查看 文件的类型 [rootelk-node-1 rsyslog] # file 192.168.1.16.log 192.168.1.16.log: Non-ISO extended-ASCII text, with very long lines, with LF, NEL line terminators 如果命令返回结果说明改日志为utf-8&#xff0c;则logstash配置文件中charset设置为UTF-8 如果命令…

团队编程项目代码设计规范(爬取豆瓣电影top250)

基本格式 缩进 使用4个空格进行缩进 行宽 每行代码尽量不超过80个字符 理由&#xff1a; 这在查看side-by-side的diff时很有帮助方便在控制台下查看代码太长可能是设计有缺陷换行 Python支持括号内的换行。这时有两种情况。 第二行缩进到括号的起始处foo long_function_name(v…

程序员的浪漫

程序员的浪漫 马上就到520了&#xff0c;各位小伙伴想好了准备什么礼物送个自己的另一半呢&#xff1f;还没想好的注意啦&#xff01;&#xff01;现在还有机会&#xff0c;今天给大家分享一些程序员的浪漫创意礼物&#xff0c;希望你可以从中找到一些灵感。 One Link&#xff…

14-1 部署项目

1313转载于:https://www.cnblogs.com/ZHONGZHENHUA/p/9011671.html

The listener supports no services

$ lsnrctl start 报错提示: The listener supports no services The command completed successfully 如图所示&#xff1a; 这样启动后远程连接会报错&#xff1a; oracle ORA-12514:TNS:listener does not currently know of service requested in connect descriptor 问题原…

Luogu P2577 [ZJOI2005]午餐

一道贪心类背包DP的好题 首先发现一个十分显然的性质&#xff0c;没有这个性质整道题目都难以下手&#xff1a; 无论两队的顺序如何&#xff0c;总是让吃饭慢的人先排队 这是一个很显然的贪心&#xff0c;因为如果让吃饭慢的排在后面要更多的时间至少没有这样优 因此我们先按吃…

SEO【总结】by 2019年5月

2019独角兽企业重金招聘Python工程师标准>>> 关键点&#xff1a; 1、代码 1.1、seo前端代码&#xff1a;基于Html代码的SEOherf&#xff1a;https://my.oschina.net/u/2862573/blog/3030664 注意的要点&#xff1a; h1&#xff0c;h2的内容很关键 网页的压缩、静态化…

Linux 系统的启动顺序

第一步&#xff1a;加载BIOS当你打开ia计算机的电源&#xff0c;计算机会首先加载计算机主板的BIOS信息&#xff0c;因为它包含了CPU的相关信息&#xff0c;设备启动顺序[安装系统的U盘启动顺序]&#xff0c;内存信息&#xff0c;时钟信息&#xff0c;PnP特性等等&#xff0c; …

Oracle数据库 查看表是否是 索引组织表的方法

1. 最近在工作过程中发现 一个表插入很慢 以为是索引组织表, 所以一直有点纠结 但是发现 产品里面是没有IOT的 于是找了下公司的OCP 问了下 如何查看 就是 user_tables 视图里面的一个字段. 见图: 转载于:https://www.cnblogs.com/jinanxiaolaohu/p/9018037.html

Windows server 2016 搭建RDS服务

计算机的更新换代太快&#xff0c;新购置的计算机没几年便觉得运行速度越来越慢&#xff0c;尤其是在运行一些比较大的应用程序是&#xff0c;用户总是抱怨运行速度太慢或者总是死机等问题。如果要更换新的计算机&#xff0c;又得不到领导的批准&#xff0c;因此对于企业来说&a…

π 的定义(极限)

圆周率&#xff0c;周长&#xff08;2πr&#xff09;与直径&#xff08;2r&#xff09;的比值。在名称上&#xff0c;是通过计算命名的。 1. 刘徽割圆与圆周率 π 通过圆内接正多边形的周长来计算圆周长&#xff0c;是三世纪中期我国魏晋时代的数学家刘徽的光辉思想。 对于圆内…

前端开发浏览器兼容问题

csshack 1234567我很少使用hacker的&#xff0c;可能是个人习惯吧&#xff0c;我不喜欢写的代码IE不兼容&#xff0c;然后用hack来解决。不过hacker还是非常好用的。使用hacker我可以把浏览器分为3类&#xff1a;IE6 &#xff1b;IE7和遨游&#xff1b;其他&#xff08;IE8 chr…

springboot2.0 多数据源整合问题 At least one JPA metamodel must be present!   at

2019独角兽企业重金招聘Python工程师标准>>> 数据源代码&#xff1a; 第一个读取配置文件代码&#xff1a; package com.datasource;import org.apache.ibatis.session.SqlSessionFactory; import org.mybatis.spring.SqlSessionFactoryBean; import org.mybatis.sp…

好书推荐

阿尔花剌子模:代数学. 乔治波利亚:怎样解题:数学思维的新方法. Anany Levitin:算法设计与分析基础.转载于:https://www.cnblogs.com/mtl6906/p/7625290.html

docker实战系列之搭建rabbitmq

1.搜索镜像【注&#xff1a;因为我这里采用的是阿里云镜像加速器,所以我直接在阿里云中搜索相关镜像路径】,点击"详情"查看公网拉取路径 2.拉取镜像 docker pull registry.cn-hangzhou.aliyuncs.com/jc/rabbitmq-3 3.查看拉取的镜像 docker images 4.创建并运行容器【…

【hdu 6038】Function

【Link】:http://codeforces.com/contest/834/problem/C 【Description】 给你两个排列a和b; a排列的长度为n,b排列的长度为m; a∈[0..n-1],b∈[0..m-1]; 然后让你求一个函数f[i]; f[i]的定义域为0..n-1,值域为0..m-1 同时使得对于任意f[i],i∈[0..n-1]; f(i)bf(a[i])成…