【BZOJ 1084】 1084: [SCOI2005]最大子矩阵 (DP)
1084: [SCOI2005]最大子矩阵
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 3Sample Output
9HINT
【分析】
终于考完ws的期末考回来刷题了,表示很桑心先刷一道水题淡定一下。。。
表示又是智障看错了以为k是100。
思路很简单,m<=2,分m=1 m=2两种情况讨论。
m=1:
f[i][j]表示选了前i个数,j个矩阵的最优值,枚举最后一个矩阵转移。
m=2:
f[i][j][k]表示第一行选了前i个数,第二行选了前j个数,一共k个矩阵的最优值。
状态:1、枚举第一行最后一个矩阵。
2、枚举第二行最后一个矩阵。
3、当i=j,可以两行一起选,枚举两行一起选的最后一个矩阵。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 110 int a[][Maxn],h[][Maxn],f[Maxn][Maxn];
int d[Maxn][Maxn][Maxn]; int mymax(int x,int y) {return x>y?x:y;} int main()
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=;i<=n;i++)
for(int j=;j<m;j++) scanf("%d",&a[j][i]);
h[][]=h[][]=;
for(int i=;i<m;i++)
for(int j=;j<=n;j++) h[i][j]=h[i][j-]+a[i][j];
int ans=;
if(m==)
{
memset(f,,sizeof(f));
for(int i=;i<=n;i++)
for(int j=;j<=i&&j<=k;j++)
{
for(int l=;l<i;l++)
f[i][j]=mymax(f[i][j],f[l][j-]+h[][i]-h[][l]);
f[i][j]=mymax(f[i][j],f[i-][j]);
}
for(int i=k;i<=n;i++) ans=mymax(ans,f[i][k]);
}
else
{
memset(d,,sizeof(d));
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
for(int l=;l<=k;l++)
{
for(int p=;p<i;p++) d[i][j][l]=mymax(d[i][j][l],d[p][j][l-]+h[][i]-h[][p]);
for(int p=;p<j;p++) d[i][j][l]=mymax(d[i][j][l],d[i][p][l-]+h[][j]-h[][p]);
if(i==j)
{
for(int p=;p<i;p++) d[i][j][l]=mymax(d[i][j][l],d[p][p][l-]+h[][i]+h[][j]-h[][p]-h[][p]);
}
d[i][j][l]=mymax(d[i][j][l],d[i-][j][l]);
d[i][j][l]=mymax(d[i][j][l],d[i][j-][l]);
if(l==k) ans=mymax(ans,d[i][j][l]);
// printf("d[%d][%d][%d]= %d\n",i,j,l,d[i][j][l]);
}
}
printf("%d\n",ans);
return ;
}
2017-01-11 09:11:39
【BZOJ 1084】 1084: [SCOI2005]最大子矩阵 (DP)的更多相关文章
- BZOJ 1084: [SCOI2005]最大子矩阵 DP
1084: [SCOI2005]最大子矩阵 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1084 Description 这里有一个n* ...
- 洛谷P2331 [SCOI2005]最大子矩阵 DP
P2331 [SCOI2005]最大子矩阵 题意 : 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 第一行为n,m,k(1≤n≤ ...
- 【BZOJ 1084】 [SCOI2005]最大子矩阵(DP)
题链 http://www.lydsy.com/JudgeOnline/problem.php?id=1084 Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩 ...
- 【BZOJ 1084】[SCOI2005]最大子矩阵
Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第一行为n,m,k(1≤n≤100,1≤m≤2 ...
- bzoj1084: [SCOI2005]最大子矩阵 dp
这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 题解:m很小分类讨论,m==1时怎么搞都可以,m==2时,dp[i][j][k]表 ...
- BZOJ(6) 1084: [SCOI2005]最大子矩阵
1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3566 Solved: 1785[Submit][Sta ...
- BZOJ 1084 (SCOI 2005) 最大子矩阵
1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3560 Solved: 1779 [Submit][Sta ...
- 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] ...
随机推荐
- 省队集训 Day3 吴清华
[题目大意] 给网格图,共有$n * n$个关键节点,横向.纵向距离均为$d$,那么网格总长度和宽度均为$(n+1) * d + 1$,最外围一圈除了四角是终止节点.要求每个关键节点都要通过线连向终止 ...
- js按值及引用传递中遇到的小问题
有人闲的蛋疼,非要在函数中使用如下方式传值,尼玛一下把我搞糊涂了.于是决定发挥打破沙锅问到底的精神搞清楚它. var a = 1,b = [], c = {}; function f(a, b, c) ...
- spring mvc 提供的几个常用的扩展点
转载 :http://blog.csdn.net/gufachongyang02/article/details/43836105 这是spring3 mvc的核心流程图: SpirngMVC的第 ...
- 【转】MP3文件原理及结构解析
1.引言文件压缩技术的日新月异使得MP3成为时下最烫手的音乐格式,优质的音乐随着0与1的排列迅速散布 到世界各地,撼动人心.何谓MP3?MP3的全称是MPEG Audio Layer 3,它是一种高效 ...
- java===java基础学习(12)---方法的重写和重载
覆盖 / 重写(Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也 ...
- Sqlserver获取所有数据库名,表信息,字段信息,主键信息,以及表结构等。
--获取所有数据库名: SELECT name FROM master..sysdatabases WHERE name NOT IN ( 'master', 'model', 'msdb', 'te ...
- 004 ConcurrentHashMap原理
下面这部分内容转载自: http://www.haogongju.net/art/2350374 JDK5中添加了新的concurrent包,相对同步容器而言,并发容器通过一些机制改进了并发性能.因为 ...
- 【python】资料记录
今天看了一些关于python的知识: 1.装饰器:https://www.zhihu.com/question/25950466/answer/31731502 2.*args的用法:http://b ...
- List转换为DataTable List<Entity>
/// <summary> /// 将List转换成DataTable /// </summary> /// <typeparam name="T"& ...
- C语言实现二叉排序树
程序以'#'结尾的二叉排序树. /*(双重指针 BSTree *T)问:数据结构中 二叉树建立结点为什么用 双重指针?详细解释下双重指针 答:指针的指针.因为树的结点要用指针描述.如果只用指针,作形参 ...