[Luogu 2331] [SCOI2005]最大子矩阵
[Luogu 2331] [SCOI2005]最大子矩阵
题目描述
这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵不能相互重叠。
输入输出格式
输入格式:
第一行为n,m,k(1≤n≤100,1≤m≤2,1≤k≤10),接下来n行描述矩阵每行中的每个元素的分值(每个元素的分值的绝对值不超过32767)。
输出格式:
只有一行为k个子矩阵分值之和最大为多少。
输入输出样例
3 2 2
1 -3
2 3
-2 3
9
又是一道DP题,由于看题太过迅速,竟然没有看清m<=2!!!(好气哦qaq)
题解:
既然在知道了m<=2的条件下,那么应该是可以想到,对m=1和m=2分别考虑
(1)m=1的情况其实就是一个求k个最大字段和
那么可以用一个二维数组f[i][j]表示到了第i位选取了j个字段
那么转移就是分为不选第i位和选第i位的情况
f[i][j]=f[i-1][j]
f[i][j]=max(f[i][j],f[l-1][j-1]+sum[i]-sum[l])(1<=l<=i)
(2)m=2的情况就是一个三维DP
f[i][j][k]表示第一列选到第i行,第二列选到第j行,一共选了k个矩形
那么转移分为四种第i和第j行都不选,选第i行,选第j行,同时选第i和第j行(前提i=j)
那么具体的转移方程请见程序
#include<bits/stdc++.h>
using namespace std;
const int N=;
int n,m,k,sum,ans;
int a[N][],sum1[N],sum2[N],f[N][N][],g[N][];
int main(){
scanf("%d%d%d",&n,&m,&k);
for (int i=;i<=n;++i)
for (int j=;j<=m;++j)
scanf("%d",&a[i][j]);
for (int i=;i<=n;++i) sum1[i]=sum1[i-]+a[i][];
if (m==) for (int i=;i<=n;++i) sum2[i]=sum2[i-]+a[i][];
if (m==){
for (int i=;i<=k;++i) g[][i]=;
for (int i=;i<=n;++i)
for (int j=;j<=k;++j){
g[i][j]=g[i-][j];
for (int l=;l<=i;++l) g[i][j]=max(g[i][j],g[l-][j-]+sum1[i]-sum1[l-]);
}
printf("%d",g[n][k]); return ;
}
for (int i=;i<=k;++i) f[][][i]=;
for (int i=;i<=n;++i)
for (int j=;j<=n;++j)
for (int l=;l<=k;++l){
f[i][j][l]=max(f[i-][j][l],f[i][j-][l]);
for (int h=;h<=i;++h)
f[i][j][l]=max(f[i][j][l],f[h-][j][l-]+sum1[i]-sum1[h-]);
for (int h=;h<=j;++h)
f[i][j][l]=max(f[i][j][l],f[i][h-][l-]+sum2[j]-sum2[h-]);
if (i==j) for (int h=;h<=i;++h) f[i][j][l]=max(f[i][j][l],f[h-][h-][l-]+sum1[i]+sum2[j]-sum1[h-]-sum2[h-]);
}
printf("%d",f[n][n][k]);
}
[Luogu 2331] [SCOI2005]最大子矩阵的更多相关文章
- luogu P2331 [SCOI2005]最大子矩阵
		
传送门 \[\huge\mathit{warning}\] \[\small\text{以下说明文字高能,请心脏病,,,,,,人士谨慎观看,请未成年人在家长陪同下观看}\] 皮这一下很开心 其实是代码 ...
 - BZOJ1084或洛谷2331 [SCOI2005]最大子矩阵
		
BZOJ原题链接 洛谷原题链接 注意该题的子矩阵可以是空矩阵,即可以不选,答案的下界为\(0\). 设\(f[i][j][k]\)表示前\(i\)行选择了\(j\)个子矩阵,选择的方式为\(k\)时的 ...
 - bzoj1084&&洛谷2331[SCOI2005]最大子矩阵
		
题解: 分类讨论 当m=1的时候,很简单的dp,这里就不再复述了 当m=2的时候,设dp[i][j][k]表示有k个子矩阵,第一列有i个,第二列有j个 然后枚举一下当前子矩阵,状态转移 代码: #in ...
 - BZOJ 1084: [SCOI2005]最大子矩阵 DP
		
1084: [SCOI2005]最大子矩阵 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1084 Description 这里有一个n* ...
 - 1084: [SCOI2005]最大子矩阵
		
1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1325 Solved: 670[Submit][Stat ...
 - [luogu P2324] [SCOI2005]骑士精神
		
[luogu P2324] [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1 ...
 - bzoj千题计划198:bzoj1084: [SCOI2005]最大子矩阵
		
http://www.lydsy.com/JudgeOnline/problem.php?id=1084 m=1: dp[i][j] 前i个数,选了j个矩阵的最大和 第i个不选:由dp[i-1][j] ...
 - 【BZOJ 1084】 1084: [SCOI2005]最大子矩阵 (DP)
		
1084: [SCOI2005]最大子矩阵 Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第 ...
 - BZOJ(6) 1084: [SCOI2005]最大子矩阵
		
1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3566 Solved: 1785[Submit][Sta ...
 
随机推荐
- JavaFX桌面应用开发-Button(按钮)与事件
			
1:Button样式的操作原始代码: package application; import javafx.application.Application;import javafx.scene.Gr ...
 - Android—修改button属性
			
一般安卓里的普通按钮控件灰灰的,比较单调,我们可以给按钮加上背景图片,或者自定义按钮的圆角,颜色等属性. 下面用代码举例: <Button android:id="@+id/reset ...
 - golang  bytes 包
			
类型 []byte 的切片十分常见,Go 语言有一个 bytes 包专门用来解决这种类型的操作方法. bytes 包和字符串包十分类似.而且它还包含一个十分有用的类型 Buffer: import & ...
 - The C++ Programming Language - Bjarne Stroustrup
			
Preface Part 1: Introduction 1.1 The Structure of This Book 1.1.1 Introduction 1.1.2 Basic Facilitie ...
 - (C/C++学习)6.数组指针和指针数组
			
说明:int (*p)[4] 和 int *p[4](数组指针和指针数组),如果你是一个初学者,也许当你看到这两个名词的时候,已经懵了.其实,只要你理解了其中的含义.这两个名词对你来说会相当简单并且很 ...
 - 思维风暴 codeforces (1060A) Phone Numbers
			
这个题我真是我的问题,我看到这种题直接就想着怎么用string去枚举破解,开了一个数组去做结果模拟失败,可能开个stl容器能做的好一点...但是这个题完全不是这样做的...实际上直接比较8的个数和合法 ...
 - redis环境部署
			
运维开发技术交流群欢迎大家加入一起学习(QQ:722381733) 一.Redis服务介绍: redis简单来讲就是一个数据库,一个用来存储缓存的数据库容器,主要是让项目数据能写进缓存,为用户提搞更舒 ...
 - (转)window.location.hash 属性使用说明
			
location是javascript里边管理地址栏的内置对象,比如location.href就管理页面的url,用location.href=url就可以直接将页面重定向url.而location. ...
 - zoj  3693
			
#include<stdio.h> #include<string.h>//进位问题如3.985 应该进位3.99 int main() { int n,k,i; ...
 - [bzoj1592][Usaco09Feb]Making the Grade 路面修整_动态规划
			
Making the Grade 路面修整 bzoj-1592 题目大意:给你n段路,每段路有一个高度h[i],将h[i]修改成h[i]$\pm\delta$的代价为$\delta$,求将这n段路修成 ...