[SCOI2005][BZOJ 1084]最大子矩阵
Description
这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵
不能相互重叠。
Input
第一行为n,m,k(1≤n≤100,1≤m≤2,1≤k≤10),接下来n行描述矩阵每行中的每个元素的分值(每个元素的
分值的绝对值不超过32767)。
Output
只有一行为k个子矩阵分值之和最大为多少。
#include<bits/stdc++.h> using namespace std; inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f; } #define MN 105 #define inf 0x7f int n,m,k,a[MN][3],ans; int f[MN][15][6]; void rw(int &x,int y){if(y>x)x=y;} int main(){n=read(),m=read(),k=read();register int i,j;for(i=1;i<=n;i++)for(j=1;j<=m;j++) a[i][j]=read();if(m==1){for(i=1;i<=n;i++) for(j=1;j<=k;j++){rw(f[i][j][0],f[i-1][j][0]);rw(f[i][j][0],f[i-1][j][1]);rw(f[i][j][1],f[i-1][j][1]+a[i][1]);rw(f[i][j][1],f[i-1][j-1][0]+a[i][1]);}printf("%d\n",max(f[n][k][1],f[n][k][0]));}else{memset(f,-inf,sizeof f);for(i=0;i<=n;i++)for(j=0;j<=k;j++) f[i][j][1]=0;for(i=1;i<=n;i++)for(j=1;j<=k;j++){for(int h=1;h<=5;h++) rw(f[i][j][1],f[i-1][j][h]);f[i][j][2]=max(f[i-1][j][2],f[i-1][j][5])+a[i][1];f[i][j][3]=max(f[i-1][j][3],f[i-1][j][5])+a[i][2];rw(f[i][j][2],f[i-1][j-1][4]+a[i][1]);rw(f[i][j][3],f[i-1][j-1][4]+a[i][2]);rw(f[i][j][2],max(f[i-1][j-1][1],f[i-1][j-1][3])+a[i][1]);rw(f[i][j][3],max(f[i-1][j-1][1],f[i-1][j-1][2])+a[i][2]);f[i][j][4]=max(f[i-1][j-1][1],f[i-1][j][4])+a[i][1]+a[i][2];rw(f[i][j][4],max(f[i-1][j-1][2],f[i-1][j-1][3])+a[i][1]+a[i][2]);rw(f[i][j][4],f[i-1][j-1][5]+a[i][1]+a[i][2]);f[i][j][5]=f[i-1][j][5]+a[i][1]+a[i][2];rw(f[i][j][5],max(f[i-1][j-1][2],f[i-1][j-1][3])+a[i][1]+a[i][2]);if(j>=2) rw(f[i][j][5],max(f[i-1][j-2][1],f[i-1][j-2][4])+a[i][1]+a[i][2]);}ans=-1e12;for(i=1;i<=5;i++) rw(ans,f[n][k][i]);printf("%d\n",ans);}return 0; }
来自PaperCloud的博客,未经允许,请勿转载,TKS!
转载于:https://www.cnblogs.com/PaperCloud/p/9040483.html
[SCOI2005][BZOJ 1084]最大子矩阵相关推荐
- BZOJ 1084: [SCOI2005]最大子矩阵【DP】
1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec Memory Limit: 162 MB Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得 ...
- BZOJ 1084: [SCOI2005]最大子矩阵
1084 思路: dp[i][j][k]:第一列选前i个第二列选前j个总共选了k个子矩阵的最大值 注意空矩阵也算子矩阵 代码: #pragma GCC optimize(2) #pragma GCC ...
- [BZOJ] 1084 [SCOI2005]最大子矩阵
Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3540 Solved: 1771 [Submit][Status][Discuss] Descript ...
- bzoj 1084 DP
首先对于m==1的情况非常容易处理(其实这儿因为边界我错了好久...),直接DP就好了,设f[i][k]为这个矩阵前i个选k个矩阵的最大和,那么f[i][k]=max(f[j][k-1]+sum[j+ ...
- BZOJ刷题记录---提高组难度
BZOJ刷题记录---提高组难度 总目录详见https://blog.csdn.net/mrcrack/article/details/90228694 序号 题号 算法 思想难度 实现难度 总难度 ...
- 1084. [SCOI2005]最大子矩阵【网格DP】
Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵 不能相互重叠. Input 第一行为n,m,k(1≤n≤100,1≤m≤ ...
- BZOJ 1087: [SCOI2005]互不侵犯King
二次联通门 : BZOJ 1087: [SCOI2005]互不侵犯King /*BZOJ 1087: [SCOI2005]互不侵犯King状压dp将每一行棋子的存在状态压成一个整数f[i][j][k] ...
- 【BZOJ】【1086】 【SCOI2005】王室联邦
树分块 orz vfk && PoPoQQQ http://vfleaking.blog.163.com/blog/static/174807634201231684436977/ h ...
- P2331 [SCOI2005]最大子矩阵 题解
DP 题,好像有点恶心,主要是因为能不能选空矩阵的问题. 有些数据好像是可以选空矩阵的有些又不能选,就很离谱,但是根据原数据来看空矩阵应该是不能选的,我也不知道具体情况() 注意到 m=1m=1m=1 ...
最新文章
- 证明实对称正定矩阵A的Gauss-Seidel法必定收敛(完整过程)
- 天然气表怎么看多少方_宝宝奶粉的的营养成分表,到底怎么看?
- Python获取环境变量值
- php垃圾回收算法分代,PHP的垃圾回收机制代码实例讲解
- [LeetCode] Remove Element 分析
- spring boot项目Intellij 打包
- 2019计算机调剂困难,2019年研究生调剂困难程度远超想象
- 学习python内一般函数知识
- DSkin学习之DSkin.Forms
- page cache和buffer cache之间的关系以及验证
- 这世界没有能够预测未来的魔法水晶球
- 编程c语言黑与白,C语言黑与白问题代码及解析
- 2020年国内外值得关注的15家PaaS平台与SaaS厂商!
- Linux扩容swap分区
- 详解 yolo配置文件各参数的含义
- 前端学习从入门到高级全程记录之8 (PS基本使用综合案例)
- Python startswith endswith
- 【latex】表格添加注脚;对表格的内容进行注释
- p51 thinkpad 拆解_ThinkPad P51硬盘更换指南(图解)
- Overleaf LaTex 学习(一):页边距设置与matlab代码
热门文章
- 简单解决 WIN10更新后 远程桌面提示 CredSSP加密Oracle修正的问题
- 进程和线程的定义、区别与联系
- P1160 队列安排 洛谷
- 【从理论到代码】旋转矩阵与欧拉角 一
- strcpy的用法、c语言实现、及注意点
- oracle应用程序开发,关于Oracle 数据库应用程序开发问题
- python随机森林库_随机森林库:R和Python中的不同结果
- asp网上书店的代码_使用Helm将ASP.NET Core应用程序部署到Kubernetes容器集群
- gc android,Android GC Log解读
- group python 读hdf5_Python处理Excel模块的对比分析