【SCOI2005】 最大子矩阵 BZOJ 1084
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
1 -3
2 3
-2 3
Sample Output
思路
看到题目:好难啊。。一点思路都没有。
然后看到数据范围M<=2,你™在逗我?何必用矩形来吓人呢。。就是两个一维的最大子矩阵问题嘛!
然后用f[i][j][k]表示第一列用到i,第二列用到j,已经有k个矩形的最大值。
所以f[i][j][k]=max{f[i'-1][j][k-1]+sum[1][i'][i],f[i][j'-1][k-1]+sum[2][j'][j]}
当i==j的时候还会有一个转移,就是两行一起形成一个矩形。
f[i][i][k]=max{f[i'-1][i'-1][k-1]+sum[1][i'][i]+sum[2][i'][i]}
其中sum[i][j][k]表示第i列从第j个数加到第k个数的和。
还有一种特殊情况就是全都是负数,或者非负数的个数不够k的,就先选出所有的非负数,然后加上最大的几个负数就行了。
可是数据里面好像没有这种情况TAT。。伐开森。
#include <iostream>
#include <cstring>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <list>
#include <vector>
#include <ctime>
#include <functional>
#define pritnf printf
#define scafn scanf
#define sacnf scanf
#define For(i,j,k) for(int i=(j);i<=(k);(i)++)
#define Clear(a) memset(a,0,sizeof(a))
using namespace std;
typedef unsigned int Uint;
const int INF=0x3fffffff;
///==============struct declaration============== ///==============var declaration=================
const int MAXN=;
int row,col,k,temp=;
int A[MAXN][],Sum[MAXN][];
int f[MAXN][MAXN][];
///==============function declaration============
int cmp(int a,int b){return a>b;}
///==============main code=======================
int main()
{
#define FILE__
#ifdef FILE__
freopen("input","r",stdin);
freopen("output","w",stdout);
#endif
scanf("%d%d%d",&row,&col,&k);
int Plus=;
for(int i=;i<=row;i++)
for(int j=;j<=col;j++){
scanf("%d",&A[i][j]);
Sum[i][j]=Sum[i-][j]+A[i][j];
if (A[i][j]>=){
Plus++;
temp+=A[i][j];
}
}
for(int r1=;r1<=row;r1++)
for(int r2=;r2<=row;r2++)
for(int p=;p<=k;p++){
f[r1][r2][p]=max(f[r1][r2-][p],f[r1-][r2][p]);
for(int NewR=;NewR<=max(r1,r2);NewR++){
if (NewR<=r1)
f[r1][r2][p]=max(f[r1][r2][p],f[NewR-][r2][p-]+Sum[r1][]-Sum[NewR][]);
if (NewR<=r2)
f[r1][r2][p]=max(f[r1][r2][p],f[r1][NewR-][p-]+Sum[r2][]-Sum[NewR][]);
if (r1==r2){
f[r1][r2][p]=max(f[NewR-][NewR-][p-]+Sum[r1][]-Sum[NewR][]+Sum[r2][]-Sum[NewR][],f[r1][r2][p]);
}
}
}
if (Plus>=k)
printf("%d\n",f[row][row][k]);
else{
int Arr[MAXN*];
for(int i=;i<=row;i++){
Arr[i*-]=A[i][];if (Arr[i*-]>) Arr[i*-]=-INF;
Arr[i*]=A[i][];if (Arr[i*]>) Arr[i*]=-INF;
}
sort(Arr+,Arr++row*,cmp);
for(int i=Plus+;i<=k;i++)
temp+=Arr[i-Plus];
printf("%d\n",temp);
}
return ;
}
///================fuction code====================
BZOJ 1084
【SCOI2005】 最大子矩阵 BZOJ 1084的更多相关文章
- 1084: [SCOI2005]最大子矩阵 - BZOJ
Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第一行为n,m,k(1≤n≤100,1≤m≤2 ...
- BZOJ 1084: [SCOI2005]最大子矩阵 DP
1084: [SCOI2005]最大子矩阵 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1084 Description 这里有一个n* ...
- 【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 ...
- [BZOJ 1084] [SCOI2005] 最大子矩阵 【DP】
题目链接:BZOJ - 1084 题目分析 我看的是神犇BLADEVIL的题解. 1)对于 m = 1 的情况, 首先可能不取 Map[i][1],先 f[i][k] = f[i - 1][k]; ...
- 1084: [SCOI2005]最大子矩阵
1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1325 Solved: 670[Submit][Stat ...
- 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 (SCOI 2005) 最大子矩阵
1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3560 Solved: 1779 [Submit][Sta ...
- [Luogu 2331] [SCOI2005]最大子矩阵
[Luogu 2331] [SCOI2005]最大子矩阵 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 ...
随机推荐
- 简单的angular购物车商品小计
<!DOCTYPE html> <html lang="en" ng-app="shopApp"> <head> <m ...
- ReactNative官方中文文档0.21
整理了一份ReactNative0.21中文文档,提供给需要的reactnative爱好者.ReactNative0.21中文文档.chm 百度盘下载:ReactNative0.21中文文档 来源: ...
- JavaScript中的this陷阱的最全收集 没有之一
当有人问起你JavaScript有什么特点的时候,你可能立马就想到了单线程.事件驱动.面向对象等一堆词语,但是如果真的让你解释一下这些概 念,可能真解释不清楚.有句话这么说:如果你不能向一个6岁小孩解 ...
- EF6 在 SQLite中使用备忘
== 菜鸟级选手试验在EF6中使用Sqlite,零EF基础,少量Sqlite基础.经过断断续续的很长时间 - _ -! >>连接 1. 安装 使用目前最新版本EF6.1,Sqlite1.0 ...
- Css--深入学习之切角
本文是作者从别的网站和文章学习了解的知识,简单做了个笔记,想要学习更多的可以参考这里:[css进阶]伪元素的妙用--单标签之美,奇思妙想 带切角的矩形: 该图来源于(奇思妙想) Css代码: .not ...
- 黄聪:phpexcel中文教程-设置表格字体颜色背景样式、数据格式、对齐方式、添加图片、批注、文字块、合并拆分单元格、单元格密码保护
首先到phpexcel官网上下载最新的phpexcel类,下周解压缩一个classes文件夹,里面包含了PHPExcel.php和PHPExcel的文件夹,这个类文件和文件夹是我们需要的,把class ...
- 数据结构图文解析之:直接插入排序及其优化(二分插入排序)解析及C++实现
0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...
- BZOJ 3230: 相似子串
3230: 相似子串 Time Limit: 20 Sec Memory Limit: 128 MBSubmit: 1485 Solved: 361[Submit][Status][Discuss ...
- 用Python制作新浪微博爬虫
早上刷空间发现最近好多人过生日诶~ 仔细想想,好像4月份的时候也是特别多人过生日[比如我 那么每个人生日的月份有什么分布规律呢...突然想写个小程序统计一下 最简单易得的生日数据库大概就是新浪微博了: ...
- [bigdata] spark集群安装及测试
在spark安装之前,应该已经安装了hadoop原生版或者cdh,因为spark基本要基于hdfs来进行计算. 1. 下载 spark: http://mirrors.cnnic.cn/apache ...