[Luogu 2331] [SCOI2005]最大子矩阵

题目描述

这里有一个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

又是一道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]最大子矩阵的更多相关文章

  1. luogu P2331 [SCOI2005]最大子矩阵

    传送门 \[\huge\mathit{warning}\] \[\small\text{以下说明文字高能,请心脏病,,,,,,人士谨慎观看,请未成年人在家长陪同下观看}\] 皮这一下很开心 其实是代码 ...

  2. BZOJ1084或洛谷2331 [SCOI2005]最大子矩阵

    BZOJ原题链接 洛谷原题链接 注意该题的子矩阵可以是空矩阵,即可以不选,答案的下界为\(0\). 设\(f[i][j][k]\)表示前\(i\)行选择了\(j\)个子矩阵,选择的方式为\(k\)时的 ...

  3. bzoj1084&&洛谷2331[SCOI2005]最大子矩阵

    题解: 分类讨论 当m=1的时候,很简单的dp,这里就不再复述了 当m=2的时候,设dp[i][j][k]表示有k个子矩阵,第一列有i个,第二列有j个 然后枚举一下当前子矩阵,状态转移 代码: #in ...

  4. BZOJ 1084: [SCOI2005]最大子矩阵 DP

    1084: [SCOI2005]最大子矩阵 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1084 Description 这里有一个n* ...

  5. 1084: [SCOI2005]最大子矩阵

    1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1325  Solved: 670[Submit][Stat ...

  6. [luogu P2324] [SCOI2005]骑士精神

    [luogu P2324] [SCOI2005]骑士精神 题目描述 输入输出格式 输入格式: 第一行有一个正整数T(T<=10),表示一共有N组数据.接下来有T个5×5的矩阵,0表示白色骑士,1 ...

  7. 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] ...

  8. 【BZOJ 1084】 1084: [SCOI2005]最大子矩阵 (DP)

    1084: [SCOI2005]最大子矩阵 Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第 ...

  9. BZOJ(6) 1084: [SCOI2005]最大子矩阵

    1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 3566  Solved: 1785[Submit][Sta ...

随机推荐

  1. 程序员不可不知的Linux性能工具

    前言 在实际开发中,有时候会收到一些服务的监控报警,比如CPU飙高,内存飙高等,这个时候,我们会登录到服务器上进行排查.本篇博客将涵盖这方面的知识:Linux性能工具. 一次线上问题排查模拟 背景:服 ...

  2. eclipse常用设置之项目分组查看

    1.打开‘NaviNavigator’ 视图,windows-->show views->NaviNavigator; 2.在NaviNavigator视图下选择select workin ...

  3. IDEA生成增强for循环

    itar 生成array for代码块 for (int i = 0; i < array.length; i++) { = array[i]; } itco 生成Collection迭代 fo ...

  4. idea中配置xml不自动提示解决方案

    1.打开设置File-->Settings(或者Ctrl + Alt + S)--->Languages&Frameworks-->Schemas and DTDS 2.选择 ...

  5. 删数据ORA-02292主键约束问题

    通常在删除某个表A的时候,会出现这个错误.原因是另一个表B的某个字段引用了A表的某个字段作为约束(这个的另一个说法是外键). 假如引用的字段叫field,当B.field = A.field , 而你 ...

  6. LINUX -- pthread_detach()与pthread_join()

    pthread_detach()即主线程与子线程分离,子线程结束后,资源自动回收. int pthread_join(pthread_t tid, void **thread_return); {su ...

  7. iPhone设备当前IP和SSID的获取

    #import <Foundation/Foundation.h> typedef void(^Complation)(NSString *res); @interface WIFIMan ...

  8. hdu2013 蟠桃记【C++】

    蟠桃记 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submiss ...

  9. hadoop datanode usages方差算法

    stdDev 标准差(方差) 阐述及应用 简单来说,标准差是一组数值自平均值分散开来的程度的一种测量观念.一个较大的标准差,代表大部分的数值和其平均值之间差异较大:一个较小的标准差,代表这些数值较接近 ...

  10. 深入浅出了解HTTP协议

    深入浅出了解HTTP协议