这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵不能相互重叠。

题解:m很小分类讨论,m==1时怎么搞都可以,m==2时,dp[i][j][k]表示第一列枚举到i,第二列枚举到j,花了k次操作的最大子矩阵和,然后转移有三种一种是只转移i,一种是只转移j,还有一种是ij都转移,然后我们需要枚举空出来的地方的终点,我们预处理出ma[i][j]表示从i+1到j的后缀最大和,三维是三种转移所需要的的情况,然后可以O(3*N^3)的解决

/**************************************************************
Problem: 1084
User: walfy
Language: C++
Result: Accepted
Time:748 ms
Memory:2716 kb
****************************************************************/ //#pragma comment(linker, "/stack:200000000")
//#pragma GCC optimize("Ofast,no-stack-protector")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
//#pragma GCC optimize("unroll-loops")
#include<bits/stdc++.h>
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define pi acos(-1.0)
#define ll long long
#define vi vector<int>
#define mod 1000000007
#define C 0.5772156649
#define ls l,m,rt<<1
#define rs m+1,r,rt<<1|1
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pii pair<int,int>
#define cd complex<double>
#define ull unsigned long long
#define base 1000000000000000000
#define fio ios::sync_with_stdio(false);cin.tie(0) using namespace std; const double eps=1e-;
const int N=+,maxn=+,inf=0x3f3f3f3f,INF=0x3f3f3f3f3f3f3f3f; int n,m,K;
ll a[N][],sum[N][],ma[N][N][];
ll dp[N][N][];
void prepare()
{
if(m==)
{
for(int j=;j<=n;j++)a[j][]=-1e9;
m=;
}
for(int i=;i<=n;i++)
{
sum[i][]=sum[i-][]+a[i][];
sum[i][]=sum[i-][]+a[i][];
sum[i][]=sum[i-][]+a[i][]+a[i][];
}
for(int i=;i<=;i++)
{
for(int j=;j<=n;j++)
{
for(int k=j+;k<=n;k++)
{
for(int l=j;l<=k;l++)
{
ma[j][k][i]=max(ma[j][k][i],sum[k][i]-sum[l][i]);
}
}
}
}
}
void gao()
{
for(int i=;i<=K;i++)
{
for(int j=;j<=n;j++)
{
for(int k=;k<=n;k++)
{
for(int l=j+;l<=n;l++)
{
dp[l][k][i]=max(dp[l][k][i],dp[j][k][i-]+ma[j][l][]);
}
for(int l=k+;l<=n;l++)
{
dp[j][l][i]=max(dp[j][l][i],dp[j][k][i-]+ma[k][l][]);
}
for(int l=max(j,k)+;l<=n;l++)
{
dp[l][l][i]=max(dp[l][l][i],dp[j][k][i-]+ma[max(j,k)][l][]);
}
}
}
}
ll ans=;
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
for(int k=;k<=K;k++)
ans=max(ans,dp[i][j][k]);
printf("%lld\n",ans);
}
int main()
{
scanf("%d%d%d",&n,&m,&K);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
scanf("%lld",&a[i][j]);
prepare();
gao();
return ;
}
/******************** ********************/

bzoj1084: [SCOI2005]最大子矩阵 dp的更多相关文章

  1. [bzoj1084][SCOI2005]最大子矩阵_动态规划_伪·轮廓线dp

    最大子矩阵 bzoj-1084 SCOI-2005 题目大意:给定一个n*m的矩阵,请你选出k个互不重叠的子矩阵使得它们的权值和最大. 注释:$1\le n \le 100$,$1\le m\le 2 ...

  2. BZOJ 1084: [SCOI2005]最大子矩阵 DP

    1084: [SCOI2005]最大子矩阵 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1084 Description 这里有一个n* ...

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

  4. 洛谷P2331 [SCOI2005]最大子矩阵 DP

    P2331 [SCOI2005]最大子矩阵 题意 : 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 第一行为n,m,k(1≤n≤ ...

  5. [bzoj1084][SCOI2005]最大子矩阵(DP)

    题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1084 分析: m=1时:相当于只有一行数,让你取出p段,使得总和最大 明显可以DP,f ...

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

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

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

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

  8. BZOJ1084 SCOI2005最大子矩阵

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

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

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

随机推荐

  1. 青岛网络赛J-Press the button【暴力】

    Press the Button Time Limit: 1 Second      Memory Limit: 131072 KB BaoBao and DreamGrid are playing ...

  2. 强制关机导致ORA-03113

    数据库启动报错:无法打开数据库. [oracle@localhost ORCL]$ sqlplus / as sysdba SQL*Plus: Release 11.2.0.4.0 Productio ...

  3. Kafka Producer接口

    参考, https://cwiki.apache.org/confluence/display/KAFKA/0.8.0+Producer+Example http://kafka.apache.org ...

  4. jquery ztree 刷新后记录折叠、展开状态

    ztree :http://www.ztree.me/v3/main.php 项目中用到了这个插件,刚好也有需求 在页面刷新后,保存开始的展开.折叠状态, 其实 dtree: http://www.d ...

  5. TA-Lib中文文档(一):快速开始

    TA-Lib 简介: 这是一个Python 金融指数处理库TA-LIB,他是基于 Cython 而不是 SWIG. TA-Lib is widely used by trading software ...

  6. 格式工厂将图片变小,有500kb变为16kb

    1:打开格式工厂,选择图片栏>jpg 2:点击添加文件,选择要处理 的图片.点击输出配置,配置转换后 的大小(可手动调整),越小占用空间越少,点击确定 3: 主页面点击转换按钮,转换成功后,显示 ...

  7. c primer plus(五版)编程练习-第六章编程练习

    1.编写一个程序,创建一个具有26 个元素的数组,并在其中存储26 个小写字母.并让该程序显示该数组的内容. #include<stdio.h> #define SIZE 26 int m ...

  8. 利用 TestNG 并行执行用例

    原文地址https://testerhome.com/topics/1639 一.测试类*注1 package com.testerhome; import io.appium.java_client ...

  9. pip 解决 ImportError: cannot import name 'main'

    当 pip 更新至最新版的时候,不管是执行 pip list 还说 pip install packageName 安装包,都会抛出一个异常 Traceback (most recent call l ...

  10. C++ string 类

    标准c++中string类函数介绍 注意不是CString之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必 担心内存是否足够.字符串长度等等,而且作为 ...