[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 ...
随机推荐
- 程序员不可不知的Linux性能工具
前言 在实际开发中,有时候会收到一些服务的监控报警,比如CPU飙高,内存飙高等,这个时候,我们会登录到服务器上进行排查.本篇博客将涵盖这方面的知识:Linux性能工具. 一次线上问题排查模拟 背景:服 ...
- eclipse常用设置之项目分组查看
1.打开‘NaviNavigator’ 视图,windows-->show views->NaviNavigator; 2.在NaviNavigator视图下选择select workin ...
- IDEA生成增强for循环
itar 生成array for代码块 for (int i = 0; i < array.length; i++) { = array[i]; } itco 生成Collection迭代 fo ...
- idea中配置xml不自动提示解决方案
1.打开设置File-->Settings(或者Ctrl + Alt + S)--->Languages&Frameworks-->Schemas and DTDS 2.选择 ...
- 删数据ORA-02292主键约束问题
通常在删除某个表A的时候,会出现这个错误.原因是另一个表B的某个字段引用了A表的某个字段作为约束(这个的另一个说法是外键). 假如引用的字段叫field,当B.field = A.field , 而你 ...
- LINUX -- pthread_detach()与pthread_join()
pthread_detach()即主线程与子线程分离,子线程结束后,资源自动回收. int pthread_join(pthread_t tid, void **thread_return); {su ...
- iPhone设备当前IP和SSID的获取
#import <Foundation/Foundation.h> typedef void(^Complation)(NSString *res); @interface WIFIMan ...
- hdu2013 蟠桃记【C++】
蟠桃记 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...
- hadoop datanode usages方差算法
stdDev 标准差(方差) 阐述及应用 简单来说,标准差是一组数值自平均值分散开来的程度的一种测量观念.一个较大的标准差,代表大部分的数值和其平均值之间差异较大:一个较小的标准差,代表这些数值较接近 ...
- 深入浅出了解HTTP协议
深入浅出了解HTTP协议