[SCOI2005]最大子矩阵 (动态规划)
题目描述
这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵不能相互重叠。
输入输出格式
输入格式:
第一行为n,m,k(1≤n≤100,1≤m≤2,1≤k≤10),接下来n行描述矩阵每行中的每个元素的分值(每个元素的分值的绝对值不超过32767)。
输出格式:
只有一行为k个子矩阵分值之和最大为多少。
输入输出样例
3 2 2
1 -3
2 3
-2 3
Solution
状态定义:
f[i][l] 表示到第 i 个点 用掉 l 个矩形的最大值.
转移方程:
for(pre 1--> i-1)
f[i][l]=max(f[i-1][l],f[pre][l-1]+sum[pre-->i]); //sum 表示pre到i的元素值的和.
于是 m=1 便有30 pts.
然后再想 m=2 , 由 m=1 拓展?
于是 定义状态 : f[ i ][ j ][ l ] 表示上面一列到了 i 下面一列到了 j 已选择 l 个矩阵的最大值.
想了想,m=2有一下几种情况:
1. 这个点我不做拓展 --> max( f[ i-1 ][ j-1 ][ l ] , f[ i-1 ][ j-1 ][ l ] ,f[ i ][ j-1 ][ l ] ) ;
2. 由上一列扩展一个小的 s*1 面积的
3. 由上一列扩展一个小的 s*1 面积的
4. 两列都作扩展 ,来一个 s*2 面积的
于是乎,这道题的 DP 也自然就出来了.
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,k;
int f1[][],f[][][];
int c[][],sum[][]; void solve()
{
for(int i=;i<=n;i++)
for(int l=;l<=k;l++)
{
f1[i][l]=f1[i-][l];
for(int j=;j<i;j++)
f1[i][l]=max(f1[j][l-]+sum[][i]-sum[][j],f1[i][l]);
}
cout<<f1[n][k];
return;
} int main()
{
cin>>n>>m>>k;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%d",&c[j][i]),sum[j][i]=sum[j][i-]+c[j][i];
if(m==) {solve();return ;} for(int l=;l<=k;l++)
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
{
f[i][j][l]=max(f[i-][j][l],f[i][j-][l]);
for(int pre=;pre<i;pre++) f[i][j][l]=max(f[i][j][l],f[pre][j][l-]+sum[][i]-sum[][pre]);
for(int pre=;pre<j;pre++) f[i][j][l]=max(f[i][j][l],f[i][pre][l-]+sum[][j]-sum[][pre]);
if(i==j)
for(int pre=;pre<i;pre++)
f[i][j][l]=max(f[i][j][l],f[pre][pre][l-]+sum[][i]-sum[][pre]+sum[][j]-sum[][pre]);
}
cout<<f[n][n][k]; return ;
}
[SCOI2005]最大子矩阵 (动态规划)的更多相关文章
- BZOJ1084 [SCOI2005]最大子矩阵 动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1084 题意概括 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注 ...
- BZOJ 1084 [SCOI2005]最大子矩阵 - 动态规划
传送门 题目大意: 从矩阵中取出k个互不重叠的子矩阵,求最大的和. 题目分析: 对于m=1,直接最大m子段和. 对于m=2: \(dp[i][j][k]\)表示扫描到第一列i和第2列j时选取了k个矩阵 ...
- BZOJ 1084: [SCOI2005]最大子矩阵 DP
1084: [SCOI2005]最大子矩阵 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1084 Description 这里有一个n* ...
- 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】 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 ...
- [Luogu 2331] [SCOI2005]最大子矩阵
[Luogu 2331] [SCOI2005]最大子矩阵 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 ...
- 洛谷P2331 [SCOI2005]最大子矩阵 DP
P2331 [SCOI2005]最大子矩阵 题意 : 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 第一行为n,m,k(1≤n≤ ...
随机推荐
- Drools应用实例
Drools 实例介绍 Drools编译与运行: 在Drools当中,规则的编译与运行要通过Drools提供的各种API来实现,这些API总体来讲可以分为三类:规则编译.规则收集和规则的执行. Kmo ...
- Oracle种常用性能监控SQL语句
--Oracle常用性能监控SQL语句 --1 SELECT * FROM SYS.V_$SQLAREA WHERE DISK_READS > 100; --2 监控事例的等待 SELECT E ...
- easyui 刷新页面
window.location.reload()刷新当前页面. parent.location.reload()刷新父亲对象(用于框架) opener.location.reload()刷新父窗口对象 ...
- elasticsearch最全详细使用教程:搜索详解
一.搜索API 1. 搜索API 端点地址从索引tweet里面搜索字段user为kimchy的记录 GET /twitter/_search?q=user:kimchy从索引tweet,user里面搜 ...
- caffe修改需要的东西
https://blog.csdn.net/zhaishengfu/article/details/51971768?locationNum=3&fps=1
- 【单片机实验】6LED静态串行显示
实验三 6LED静态串行显示一.实验目的1.掌握数字.字符转换成由数码管显示的八段码的软件译码方法及译码过程:2.静态显示的原理和相关程序的编写. 二.实验电路静态显示 电路如图3-2所示.显示器由6 ...
- kubernetes概念
kubernetes blog cluster cluster是计算.存储.和网络资源的集合,kubernetes利用这些资源运行各种基于容器的应用. master master是cluster的大脑 ...
- jquery 获得某一组name的id并合并
var attachmentids = $("input[name='attachmentid']").map(function(){return $(this).val()}). ...
- Greenplum/Deepgreen(集群/分布式)安装文档
Deepgreen分布式安装文档 环境准备 1.安装VMware虚拟机软件,然后在VMware安装三台Linux虚拟机(使用centos7版本) 2.使用的虚拟机如下: 192.168.136.155 ...
- grafana绘制图表
安装方法 系统为ubuntu16 1首先添加以下到/etc/apt/sources.list: deb https://packagecloud.io/grafana/stable/debian/ s ...