题目

DP

此题可以分为两个子问题。

\(m\)等于\(1\):

原题目转化为求一行数列里的\(k\)块区间的和,区间可以为空的值。

直接定义状态\(dp[i][t]\)表示前i个数分为t块的最大值。

因为区间可以为空,所以最大值再小也不会比0小,所以初始化\(dp\)值为\(0\)。

有方程\(dp[i][t]=max(dp[i-1][t],dp[j][t-1]+\sum_{k=j+1}^{i}a[k])\)

考虑顺序及边界,发现此时的\(dp[i][t]\)是从\(t-1\)块转移过来的,所以\(j\)要和\(i\)断开。但是又因为可以从\(1\)一路取到\(i\),因此\(j+1\)可以取到\(1\)。所以\(0<=j<i\),而且\(t\)要放在循环的最外面。

\(m\)等于\(2\):

同样可以\(dp\),定义状态\(dp[i][j][t]\)为第一列取到\(i\),第二列取到\(j\),分为\(t\)块的最大值。

有方程\(dp[i][j][t]=max(dp[i-1][j][t],dp[i][j-1][t],dp[o][j][t-1]+\sum_{k=o+1}^{i}a[k][1],dp[i][o][t-1]+\sum_{k=o+1}^{j}a[k][2]);\)

如果i等于j的话,还有方程

\(dp[i][j][t]=max(dp[i][j][t],dp[o][o][t-1]+\sum_{k=o+1}^ia[k][1]+a[k][2]);\)

顺序及边界和第一问一样。

#include <bits/stdc++.h>
#define N 1001
using namespace std;
int n, m, k, maxn;
int dp[N][N][40], a[N][N], sum1[N], sum2[N], dp1[N][40];
int Max(int a, int b, int c, int d) {return max(max(a, b), max(c, d));}
int Q1(int i, int j)
{
return sum1[j] - sum1[i - 1];
}
int Q2(int i, int j)
{
return sum2[j] - sum2[i - 1];
}
int main()
{
scanf("%d%d%d", &n, &m, &k);
if (m == 1)
{
for (int i = 1; i <= n; i++)
scanf("%d", &a[i][1]), sum1[i] = sum1[i - 1] + a[i][1];
for (int t = 1; t <= k; t++)
for (int i = 1; i <= n; i++)
{
dp1[i][t] = dp1[i - 1][t];
for (int j = 0; j < i; j++)
dp1[i][t] = max(dp1[i][t], dp1[j][t - 1] + Q1(j + 1, i));
}
printf("%d", dp1[n][k]);
}
else
{
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
scanf("%d", &a[i][j]);
for (int i = 1; i <= n; i++)
sum1[i] = sum1[i - 1] + a[i][1],
sum2[i] = sum2[i - 1] + a[i][2];
for (int i = 1; i <= n; i++)
dp[i][0][1] = sum1[i], dp[0][i][1] = sum2[i];
for (int t = 1; t <= k; t++)
for (int i = 1; i <= n; i++)
for (int j = 1; j <= n; j++)
{
dp[i][j][t] = max(dp[i - 1][j][t], dp[i][j - 1][t]);
for (int o = 0; o < i; o++)//选择到第i位。
dp[i][j][t] = max(dp[i][j][t], dp[o][j][t - 1] + Q1(o + 1, i));
for (int o = 0; o < j; o++)
dp[i][j][t] = max(dp[i][j][t], dp[i][o][t - 1] + Q2(o + 1, j));
if (i == j)
for (int o = 0; o < i; o++)
dp[i][j][t] = max(dp[i][j][t], dp[o][o][t - 1] + Q1(o + 1, i) + Q2(o + 1, j));
}
printf("%d", dp[n][n][k]);
}
return 0;
}

洛谷P2331[SCOI2005]最大子矩阵的更多相关文章

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

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

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

    洛谷 这一题,乍一眼看上去只想到了最暴力的暴力--大概\(n^4\)吧. 仔细看看数据范围,发现\(1 \leq m \leq 2\),这就好办了,分两类讨论. 我先打了\(m=1\)的情况,拿了30 ...

  3. 洛谷P2331 [SCOI2005] 最大子矩阵[序列DP]

    题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k(1≤n≤100,1≤m≤2 ...

  4. BZOJ1084或洛谷2331 [SCOI2005]最大子矩阵

    BZOJ原题链接 洛谷原题链接 注意该题的子矩阵可以是空矩阵,即可以不选,答案的下界为\(0\). 设\(f[i][j][k]\)表示前\(i\)行选择了\(j\)个子矩阵,选择的方式为\(k\)时的 ...

  5. bzoj1084&&洛谷2331[SCOI2005]最大子矩阵

    题解: 分类讨论 当m=1的时候,很简单的dp,这里就不再复述了 当m=2的时候,设dp[i][j][k]表示有k个子矩阵,第一列有i个,第二列有j个 然后枚举一下当前子矩阵,状态转移 代码: #in ...

  6. 洛谷 P1896 [SCOI2005]互不侵犯

    洛谷 P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8 ...

  7. BZOJ1088或洛谷2327 [SCOI2005]扫雷

    BZOJ原题链接 洛谷原题链接 很容易发现答案就只有\(0,1,2\)三种答案,而且只要知道第一个格子是否有雷就可以直接顺推下去了. 所以我们跑一次首位有雷,跑一次首位无雷判断是否可行即可. #inc ...

  8. 【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)

    洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...

  9. 洛谷 P2331 最大子矩阵 题解

    题面 对于m==1和m==2两种状态进行不同的dp: 设sum[i][1]表示第一列的前缀和,sum[i][2]表示第二列的前缀和: sum[i][1]=sum[i-1][1]+a[i][1]; su ...

随机推荐

  1. 论文笔记:DeepCF

    Abstract 推荐系统可以看作用户和物品的匹配问题,不过user以及item两者的语义空间差异太大,直接匹配不太符合实际.主流的改进CF的方法有两类:基于表示学习的CF方法以及基于函数学习的表示方 ...

  2. spring Boot 学习(二、Spring Boot与缓存)

    一.概述1. 大多应用中,可通过消息服务中间件来提升系统异步通信.扩展解耦能力 2. 消息服务中两个重要概念: 消息代理(message broker)和目的地(destination) 当消息发送者 ...

  3. python 安装 SQLAlchemy 报错

    安装 SQLAlchemy 报错 安装命令 pip install -i https://pypi.doubanio.com/simple SQLAlchemy 报错截图 编码错误,这里我们需要改下源 ...

  4. Springboot html vue.js 前后分离 跨域 Activiti6 工作流 集成代码生成器 shiro 权限

    官网:www.fhadmin.org 特别注意: Springboot 工作流  前后分离 + 跨域 版本 (权限控制到菜单和按钮) 后台框架:springboot2.1.2+ activiti6.0 ...

  5. Java知识回顾 (16)常用操作的Java示例

    环境设置 Java 实例 – 如何编译一个Java 文件? Java 实例 – Java 如何运行一个编译过的类文件? Java 实例 - 如何执行指定class文件目录(classpath)? Ja ...

  6. 十大Intellij IDEA快捷键(附IDEA快捷键详细列表及使用技巧)

    十大Intellij IDEA快捷键(附IDEA快捷键详细列表及使用技巧) Intellij IDEA中有很多快捷键让人爱不释手,stackoverflow上也有一些有趣的讨论.每个人都有自己的最爱, ...

  7. css3卡片阴影效果

    1.css3阴影用到的知识点:阴影box-shadow和插入:after before HTML部分: <!DOCTYPE html> <html> <head> ...

  8. jmeter+nmon+crontab简单的执行接口定时压测

    一.概述 临时接到任务要对系统的接口进行压测,上面的要求就是:压测,并发2000 在不熟悉系统的情况下,按目前的需求,需要做的步骤: 需要有接口脚本 需要能监控系统性能 需要能定时执行脚本 二.观察 ...

  9. iOS 测试在应用发布前后的痛点探索以及解决方案

    作者-芈 峮 前言 iOS 开发从 2010 年开始在国内不断地升温,开发和测试相关的问题不绝于耳.iOS 测试主要涉及哪些内容?又有哪些挑战呢?带着疑问我们开始第一个大问题的讨论. iOS 测试的范 ...

  10. python2+robotframework环境搭建

    目前robotframework-ride只支持python3,没办法,只能用python2.好吧 python安装不多说,太简单,下载后直接安装,然后配置两个文件路径:path:E:\mytest\ ...