[bzoj1084][SCOI2005]最大子矩阵_动态规划_伪·轮廓线dp
最大子矩阵 bzoj-1084 SCOI-2005
题目大意:给定一个n*m的矩阵,请你选出k个互不重叠的子矩阵使得它们的权值和最大。
注释:$1\le n \le 100$,$1\le m\le 2$,$1\le k\le 10$。
想法:不会。。。看了数据范围..卧槽?m<=2?????我们就可以进行一个简单的轮廓线dp。
首先,先分m==1和m==2分类讨论,m==1不说了
m==2
令f[k][i][j]是第一列到了i,第二列到了j,已经选取了k个矩形的最大权值。
转移:有3种转移方式:
1.从左侧转移:f[k][i][j]=max(f[k][i][j] , f[k-1][l][j] + before[1][i] - before[1][l] )。
2.从右侧转移,转移方程同理。
3.选取横跨左右的矩阵,此时必须有i==j:f[k][i][j]=max(f[k][i][j] , f[k-1][l][l] + before[1][i] + before[2][i] - before[1][l] - before[2][l])。
时间复杂度:$O(n^3\cdot k)$。
最后,附上丑陋的代码... ...
#include<iostream>
#include<cstdio>
#define N 110
using namespace std;
int F[12][N],f[12][N][N];
int n,m,K,s[3][N];
int a;
void dispose1()
{
for(int k=1;k<=K;k++)
for(int i=1;i<=n;i++)
{
F[k][i]=F[k][i-1];
for(int j=0;j<=i-1;j++) F[k][i]=max(F[k][i],F[k-1][j]+s[1][i]-s[1][j]);
}
int ans=0;
for(int i=0;i<=K;i++) ans=max(ans,F[i][n]);
printf("%d\n",ans);
}
void dispose2()
{
for(int i=1;i<=n;i++) s[0][i]=s[1][i]+s[2][i];
for(int k=1;k<=K;k++) for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
{
f[k][i][j]=max(f[k][i-1][j],f[k][i][j-1]);
for(int l=0;l<i;l++) f[k][i][j]=max(f[k][i][j],f[k-1][l][j]+s[1][i]-s[1][l]);
for(int l=0;l<j;l++) f[k][i][j]=max(f[k][i][j],f[k-1][i][l]+s[2][j]-s[2][l]);
if(i==j) for(int l=0;l<i;l++) f[k][i][j]=max(f[k][i][j],f[k-1][l][l]+s[0][i]-s[0][l]);
}
int ans=0;
for(int i=0;i<=K;i++) ans=max(ans,f[i][n][n]);
printf("%d\n",ans);
}
int main()
{
scanf("%d%d%d",&n,&m,&K);
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
{
scanf("%d",&a);
s[j][i]=a+s[j][i-1];
}
if(m==1) dispose1();
else dispose2();
return 0;
}
小结:一般情况下,我们能求解的只是简单问题的全部版本和复杂问题的特殊版本,所以要对问题抱有敬畏之心(Orz石总)
[bzoj1084][SCOI2005]最大子矩阵_动态规划_伪·轮廓线dp的更多相关文章
- 【BZOJ1084】最大子矩阵(动态规划)
[BZOJ1084]最大子矩阵(动态规划) 题面 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式 ...
- 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] ...
- BZOJ1084 [SCOI2005]最大子矩阵 动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1084 题意概括 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注 ...
- bzoj1084: [SCOI2005]最大子矩阵 dp
这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 题解:m很小分类讨论,m==1时怎么搞都可以,m==2时,dp[i][j][k]表 ...
- [bzoj1855][Scoi2010]股票交易_动态规划_单调队列
股票交易 bzoj-1855 Scoi-2010 题目大意:说不明白题意系列++...题目链接 注释:略. 想法:这个题还是挺难的. 动态规划没跑了 状态:dp[i][j]表示第i天手里有j个股票的最 ...
- bzoj1084: [SCOI2005]最大子矩阵
dp.状态转移方程在代码里 #include<cstdio> #include<algorithm> #include<cstring> using namespa ...
- BZOJ1084 SCOI2005最大子矩阵
考虑DP f[i][j][k]表示一行到i一行到j共取k块最大值,类似于最长公共子序列n^2那种 注意相等时可以一起拿 By:大奕哥 #include<bits/stdc++.h> usi ...
- [bzoj3622]已经没有什么好害怕的了_动态规划_容斥原理
bzoj-3622 已经没有什么好害怕的了 题目大意: 数据范围:$1\le n \le 2000$ , $0\le k\le n$. 想法: 首先,不难求出药片比糖果小的组数. 紧接着,我开始的想法 ...
- bzoj1084 [SCOI2005]最大子矩阵——背包
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1084 水题...分类讨论一下即可. 代码如下: #include<iostream&g ...
随机推荐
- Ubuntu17.10 下配置caffe 仅CPU i386可以直接apt install caffe-cpu,但是怎么运行mnist代码我懵逼了
Ubuntu16.04下配置caffe(仅CPU) 参考:http://blog.csdn.net/zt_1995/article/details/56283249 第二次配置caffe环境,依 ...
- B1003 物流运输(最短路 + dp)
这个dp其实不是那么难,状态其实很好想,但是细节有少许偏差. 当时我并没有想到最短路要在dp之外写,后来看题解之后发现要预处理出来每段时间1~M的最短路,然后直接dp. 题目: Description ...
- 第14课 SourceTree程序操作介绍
http://www.atlassian.com/software/sourcetree/overview https://www.microsoft.com/net/framework/versio ...
- (Go)05.基本数据类型和操作符
保留的关键字段 1.Question1 package main import ( "fmt" ) func list(n int) { ; i <= n; i++ { fm ...
- Tunnel Warfare(树状数组+二分)
http://poj.org/problem?id=2892 题意:输入n,m.n代表数轴的长度,m代表操作数. D x: 摧毁点x Q x: 询问村庄x最左与最右没有被摧毁的点的距离 R :恢复最 ...
- Alignment(dp)
http://poj.org/problem?id=1836 求两遍最长上升子序列,顺序求一遍,逆序求一遍. #include <stdio.h> #include <string. ...
- C#发送电子邮件代码记录
/// <summary> /// 发送电子邮件 /// </summary> /// <param name="Address">邮件地址&l ...
- 关于offer对比
前天签了三方,在签约前的几个小时,还在纠结到底该accept哪个offer,相信很多同学都会遇到这个问题,就由此展开去吧. 关于offer的选择,无外乎以下几个考察点:1.个人发展:2.地域:3.薪资 ...
- T - Amusing Joke(map)
Problem description So, the New Year holidays are over. Santa Claus and his colleagues can take a re ...
- C - Football
Problem description Petya loves football very much. One day, as he was watching a football match, he ...