1084: [SCOI2005]最大子矩阵

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 3566  Solved: 1785
[Submit][Status][Discuss]

Description

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

Input

  第一行为n,m,k(1≤n≤100,1≤m≤2,1≤k≤10),接下来n行描述矩阵每行中的每个元素的分值(每个元素的
分值的绝对值不超过32767)。

Output

  只有一行为k个子矩阵分值之和最大为多少。

Sample Input

3 2 2
1 -3
2 3
-2 3

Sample Output

9

HINT

 

Source

思路:

可以把m=1和m=2分开处理。

当m=1时,有:f[i][k]表示到前i个数为止,选k的子矩阵的最优解。

那么第i个数有选和不选两种情况

  不选:f[i][k]=max(f[i][k],f[i-1][k]);

  选:f[i][k]=max(f[i][k],f[q][k-1]+sum[i][1]-sum[q][1])

当m=2时,有:g[k][i][j]表示左列到前i个,右列到前j个数为止,选出k个子矩阵的最优解。

可先分开考虑,对于每一列有选和不选两种情况。

然后当i==j时,考虑两列同时选和不选两种情况。

  有:

g[j][i1][i2]=max(g[j][i1-1][i2],g[j][i1][i2]);

g[j][i1][i2]=max(g[j][i1][i2-1],g[j][i1][i2]);

g[j][i1][i2]=max(g[j-1][q][i2]+sum[i1][1]-sum[q][1],g[j][i1][i2]);

g[j][i1][i2]=max(g[j-1][i1][q]+sum[i2][2]-sum[q][2],g[j][i1][i2]);
g[j][i1][i2]=max(g[j-1][q][q]+sum[i1][1]-sum[q][1]+sum[i2][2]-sum[q][2],g[j][i1][i2]);
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int n,m,k;
int sum[][];
int a[][],f[][],g[][][];
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]);
sum[i][j]=sum[i-][j]+a[i][j];
}
/*for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cout<<sum[i][j]<<" ";
}
cout<<endl;
}*/
if(m==){
for(int i=;i<=n;i++){
for(int j=;j<=k;j++){
f[i][j]=max(f[i-][j],f[i][j]);
for(int q=;q<i;q++)
f[i][j]=max(f[i][j],f[q][j-]+sum[i][]-sum[q][]);
}
}
cout<<f[n][k];
}
else if(m==){
for(int i1=;i1<=n;i1++)
for(int i2=;i2<=n;i2++)
for(int j=;j<=k;j++){
g[j][i1][i2]=max(g[j][i1-][i2],g[j][i1][i2]);
g[j][i1][i2]=max(g[j][i1][i2-],g[j][i1][i2]);
for(int q=;q<i1;q++)
g[j][i1][i2]=max(g[j-][q][i2]+sum[i1][]-sum[q][],g[j][i1][i2]);
for(int q=;q<i2;q++)
g[j][i1][i2]=max(g[j-][i1][q]+sum[i2][]-sum[q][],g[j][i1][i2]);
if(i1==i2)
for(int q=;q<i1;q++)
g[j][i1][i2]=max(g[j-][q][q]+sum[i1][]-sum[q][]+sum[i2][]-sum[q][],g[j][i1][i2]);
// cout<<g[j][i1][i2]<<"-->";
}
cout<<g[k][n][n];
}
}
/*
3 2 2
1 -3
2 3
-2 3
*/

BZOJ(6) 1084: [SCOI2005]最大子矩阵的更多相关文章

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

    http://www.lydsy.com/JudgeOnline/problem.php?id=1084 有一个1A--- 本题没看懂,,不会啊囧..感觉完全设不了状态..看了题解,囧,m<=2 ...

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

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

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

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

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

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

  5. [BZOJ 1084] [SCOI2005] 最大子矩阵 【DP】

    题目链接:BZOJ - 1084 题目分析 我看的是神犇BLADEVIL的题解. 1)对于 m = 1 的情况, 首先可能不取 Map[i][1],先 f[i][k] = f[i - 1][k];   ...

  6. BZOJ 1084 [SCOI2005]最大子矩阵 - 动态规划

    传送门 题目大意: 从矩阵中取出k个互不重叠的子矩阵,求最大的和. 题目分析: 对于m=1,直接最大m子段和. 对于m=2: \(dp[i][j][k]\)表示扫描到第一列i和第2列j时选取了k个矩阵 ...

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

    NICE 的DP 题,明白了题解真是不错. Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1228  Solved: 622[Submit][Stat ...

  8. 1084: [SCOI2005]最大子矩阵 - BZOJ

    Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第一行为n,m,k(1≤n≤100,1≤m≤2 ...

  9. bzoj 1084: [SCOI2005]最大子矩阵【dp】

    分情况讨论,m=1的时候比较简单,设f[i][j]为到i选了j个矩形,前缀和转移一下就行了 m=2,设f[i][j][k]为1行前i个,2行前j个,一共选了k个,i!=j的时候各自转移同m=1,否则转 ...

随机推荐

  1. [Code+#1]大吉大利,晚上吃鸡!

    输入输出样例 输入样例#1: 7 7 1 7 1 2 2 2 4 2 4 6 2 6 7 2 1 3 2 3 5 4 5 7 2 输出样例#1: 6 输入样例#2: 5 5 1 4 1 2 1 1 3 ...

  2. ACM博弈论总结

    一.Bash博弈 1.问题模型:只有一堆n个物品,两人轮流从这堆物品中取物,最多取m个,最后取光者胜. 2.解决思路:当n=m+1时,由于一次最多取m个,无论先取者拿走多少个,后取者都能一次拿走剩余的 ...

  3. 常用JavaScript代码库(又名:WFang.js)

    1.根据公司项目封装ajax请求,结合layer框架一起使用 /*提取接口公共部分*/ var ApiConf = { server:"http://localhost:8080/Batte ...

  4. kafka_2.11-0.8.2.2.tgz的3节点集群的下载、安装和配置(图文详解)

    kafka_2.10-0.8.1.1.tgz的1或3节点集群的下载.安装和配置(图文详细教程)绝对干货 一.安装前准备 1.1 示例机器 二. JDK7 安装 1.1 下载地址 下载地址: http: ...

  5. 分布式爬虫系统设计、实现与实战:爬取京东、苏宁易购全网手机商品数据+MySQL、HBase存储

    http://blog.51cto.com/xpleaf/2093952 1 概述 在不用爬虫框架的情况,经过多方学习,尝试实现了一个分布式爬虫系统,并且可以将数据保存到不同地方,类似MySQL.HB ...

  6. C#基础 进制转换6/17

    二进制→十进制: 计算公式:a*20+b*21+c*22+…+m*2(n-1) 公式中a为二进制数右边第一位数,b为第二位数,以此类推 例:二进制1011010转换为十进制数为 0*20+1*21+0 ...

  7. React 篇 Search Bar and content Table

    我们要构建一个模块,其中包含一个内容显示的表格,然后上面有一个提供Search的栏位,并对Search中输入栏进行监听,当有改变的时候,触发Search然后对内容表中的内容进行过滤. Demo Lin ...

  8. 对Oracle 、SQL Server、MySQL、PostgreSQL数据库优缺点分析

    对Oracle .SQL Server.MySQL.PostgreSQL数据库优缺点分析 Oracle Database Oracle Database,又名Oracle RDBMS,或简称Oracl ...

  9. HiveServer2后台运行

    nohup hive --service hiveserver2 & 或者直接: nohup hiveserver2 &

  10. 【笔记JS/HTML/CSS】ubuntu环境下的sublime text2 安装 zenCoding

    刚接触web编程的时候就被老师安利了sublime text2 这个文本编辑器,后来发现它真的挺好用的,无论是windows还是ubuntu,都可以很简单地下载安装(到官网,免费哦),三分钟内就搞定了 ...