最大子矩阵 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的更多相关文章

  1. 【BZOJ1084】最大子矩阵(动态规划)

    [BZOJ1084]最大子矩阵(动态规划) 题面 题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式 ...

  2. 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] ...

  3. BZOJ1084 [SCOI2005]最大子矩阵 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1084 题意概括 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注 ...

  4. bzoj1084: [SCOI2005]最大子矩阵 dp

    这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 题解:m很小分类讨论,m==1时怎么搞都可以,m==2时,dp[i][j][k]表 ...

  5. [bzoj1855][Scoi2010]股票交易_动态规划_单调队列

    股票交易 bzoj-1855 Scoi-2010 题目大意:说不明白题意系列++...题目链接 注释:略. 想法:这个题还是挺难的. 动态规划没跑了 状态:dp[i][j]表示第i天手里有j个股票的最 ...

  6. bzoj1084: [SCOI2005]最大子矩阵

    dp.状态转移方程在代码里 #include<cstdio> #include<algorithm> #include<cstring> using namespa ...

  7. BZOJ1084 SCOI2005最大子矩阵

    考虑DP f[i][j][k]表示一行到i一行到j共取k块最大值,类似于最长公共子序列n^2那种 注意相等时可以一起拿 By:大奕哥 #include<bits/stdc++.h> usi ...

  8. [bzoj3622]已经没有什么好害怕的了_动态规划_容斥原理

    bzoj-3622 已经没有什么好害怕的了 题目大意: 数据范围:$1\le n \le 2000$ , $0\le k\le n$. 想法: 首先,不难求出药片比糖果小的组数. 紧接着,我开始的想法 ...

  9. bzoj1084 [SCOI2005]最大子矩阵——背包

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1084 水题...分类讨论一下即可. 代码如下: #include<iostream&g ...

随机推荐

  1. codevs2594解药还是毒药(状压dp)

    2594 解药还是毒药  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond     题目描述 Description Smart研制出对付各种症状的解药,可是 ...

  2. 浅讲ajax

    1.ajax入门案例 1.1 搭建Web环境 ajax对于各位来说,应该都不陌生,正因为ajax的产生,导致前台页面和服务器之间的数据传输变得非常容易,同时还可以实现页面的局部刷新.通过在后台与服务器 ...

  3. [Apple开发者帐户帮助]六、配置应用服务(4)创建MusicKit标识符和私钥

    要与Apple Music服务进行通信,您将使用MusicKit私钥对一个或多个开发人员令牌进行签名. 首先注册音乐标识符以识别您的应用.为使用Apple Music API的每个应用注册音乐标识符. ...

  4. Vue发布过程中遇到坑,以及webpack打包优化

    前言 这段时间,本人自己做了一个vue画面部署到自己的服务器上,发现运行速度慢的的惊人,虽然服务器很渣(本人没什么钱,只能租最差的服务器,主要是给自己学习用的),但是这样开发出来的网站简直不能用,所以 ...

  5. Blender插件编写指南

    前言 Blender插件是Blender的利器, 用户可以使用各种插件扩充Blender的功能. Blender Python插件以bpy.props, bpy.types.Operator, bpy ...

  6. Redis学习笔记(五)- 数据类型之set类型

    Redis 的set是string类型的无序集合.set元素最大可以包含(2的32次方-1)个元素.set的是通过hash table实现的,所以添加,删除,查找的复杂度都是O(1).hash tab ...

  7. 关于改变安卓Button样式,这里有一个好方法。

    首先,在drawable下创建一个新的xml文件(例如我创建的为button.xml).然后在里面输入以下代码. <item> <shape> <gradient and ...

  8. Webpack 打包学习

    前段时间项目主管让测试组长研究webpack打包方式,闲暇时自己想学习一下,留着备用,本周日学习一下. https://www.jianshu.com/p/42e11515c10f

  9. Java:Java 队列的遍历

    Java队列到底有没有可以遍历的功能呢?暂且试一下吧 参考链接:stl容器遍历测试 1.LinkedList实现简单遍历 for(Iter =LocTimesSerials.size()-1; iSe ...

  10. php xss 函数

    function xss($string) { if (is_array($string)||is_object($string)||is_resource($string)) { return '' ...