[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. 类 Fabric 主机管理程序开发

    类 Fabric 主机管理程序开发:1. 运行程序列出主机组或者主机列表2. 选择指定主机或主机组3. 选择让主机或者主机组执行命令或者向其传输文件(上传/下载4. 充分使用多线程或多进程5. 不同主 ...

  2. java 导入导出的 命令

    $exp lddba/ld_321@192.168.1.3/testora file=E:\db_bak\ld20170219_1testora.dmp log=E:\db_bak\ld2017021 ...

  3. P1886 滑动窗口&&P1440 求m区间内的最小值

    声明:下面这两个题就不要暴力了,学一学单调队列吧 推荐博文:https://www.cnblogs.com/tham/p/8038828.html 单调队列入门题 P1440 求m区间内的最小值 题目 ...

  4. PAT 1096. Consecutive Factors

    Among all the factors of a positive integer N, there may exist several consecutive numbers. For exam ...

  5. linux 各命令字 练习

    ===============================================================                                     ...

  6. 【ACM】nyoj_106_背包问题_201308152026

    背包问题时间限制:3000 ms  |  内存限制:65535 KB 难度:3描述 现在有很多物品(它们是可以分割的),我们知道它们每个物品的单位重量的价值v和重量w(1<=v,w<=10 ...

  7. [bzoj2850]巧克力王国_KD-Tree

    巧克力王国 bzoj-2850 题目大意:给出n块巧克力,每块巧克力都有自己的两个参数x和y和本身的价值val,询问:m个人,每个人有两个系数和一个限度a,b,和c.求所有ax+by<=c的巧克 ...

  8. Spring MVC-表单(Form)标签-下拉框(Dropdown)示例(转载实践)

    以下内容翻译自:https://www.tutorialspoint.com/springmvc/springmvc_dropdown.htm 说明:示例基于Spring MVC 4.1.6. 以下示 ...

  9. 开源GIS软件 2

    Android上的导航软件 AndNav AndNav 是一款 Android 手机上的 GPS导航软件(非开源).软件支持GPS定位信息,目的地查询,道路建议管理,导航提示等功能,十分强大的一款软件 ...

  10. Mac下使用OpenMP

    Mac下使用OpenMP,修改Build Options 下面的compiler for c/c++/objective-C 为 LLVM GCC 4.2 - Language 则可以找到Enable ...