P2331 [SCOI2005]最大子矩阵 (动规:分类讨论状态)
题目链接:传送门
题目:
题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵不能相互重叠。
输入输出格式
输入格式: 第一行为n,m,k(≤n≤,≤m≤,≤k≤),接下来n行描述矩阵每行中的每个元素的分值(每个元素的分值的绝对值不超过32767)。 输出格式: 只有一行为k个子矩阵分值之和最大为多少。 输入输出样例
输入样例#: 复制 - - 输出样例#: 复制
PS:好像有很多类似的题目,上次的那道中国象棋(放炮的)也是,都是分类讨论多种情况就好了。
思路:
注意到m ≤ 2,所以可以按行dp,分类讨论转移的情况。
① 当前行不选;
② 当前行选左边;
③ 当前行选右边;
④ 当前行两个都选,但是作为两个矩阵;
⑤ 当前行两个都选,作为同一个矩阵;
以上的m = 2时的情况,m = 1时更简单,只有选或者不选,就不赘述了。
状态:
f[i][j][k] 表示当前第i行,构造了j个矩阵,当前行的状态为k,(k = 0 - 4对应上面的① - ⑤)
状态转移方程很容易得出,见代码。
时间复杂度是O(NM4K)
#include <bits/stdc++.h> using namespace std;
const int INF = 0x3f3f3f3f;
const int MAX_N = + ;
const int MAX_M = + ;
const int MAX_K = + ; inline void tomax(int&a, int b)
{
a = max(a, b);
} int mat[MAX_N][MAX_M];
int f[MAX_N][MAX_K][]; int main()
{
int N, M, K;
cin >> N >> M >> K;
for (int i = ; i <= N; i++)
for (int j = ; j <= M; j++)
scanf("%d", &mat[i][j]);
memset(f, -INF, sizeof f);
for (int i = ; i <= N; i++)
for (int j = ; j <= K; j++)
f[i][j][] = ;
if (M == ) {
for (int i = ; i <= N; i++)
for (int j = ; j <= K; j++) {
tomax(f[i][j][], f[i-][j][]);
tomax(f[i][j][], f[i-][j][]);
if (j- >= )
tomax(f[i][j][], f[i-][j-][]);
tomax(f[i][j][], f[i-][j][]);
f[i][j][] += mat[i][];
}
cout << max(f[N][K][], f[N][K][]) << endl;
return ;
}
for (int i = ; i <= N; i++) {
for (int j = ; j <= K; j++) {
for (int k = ; k <= ; k++) {
//0:当前行不选
tomax(f[i][j][], f[i-][j][k]);
//1:当前行选左边
if ((k == || k == || k == ) && (j- >= ))
tomax(f[i][j][], f[i-][j-][k]);
else if (k == || k == )
tomax(f[i][j][], f[i-][j][k]);
//2:当前行选右边
if ((k <= || k == ) && j- >= )
tomax(f[i][j][], f[i-][j-][k]);
else if (k == || k == )
tomax(f[i][j][], f[i-][j][k]);
//3:当前行左右都选(分开)
if ((k == || k == ) && j- >= )
tomax(f[i][j][], f[i-][j-][k]);
else if ((k == || k == ) && j- >= )
tomax(f[i][j][], f[i-][j-][k]);
else if (k == )
tomax(f[i][j][], f[i-][j][k]);
//4:当前行左右都选(一起的)
if (k != && j- >= )
tomax(f[i][j][], f[i-][j-][k]);
else if (k == )
tomax(f[i][j][], f[i-][j][k]);
}
f[i][j][] += mat[i][];//1:当前行选左边
f[i][j][] += mat[i][];//2:当前行选右边
f[i][j][] += mat[i][] + mat[i][];//3:当前行左右都选(分开)
f[i][j][] += mat[i][] + mat[i][];//4:当前行左右都选(一起的)
}
}
int ans = -INF;
for (int k = ; k <= ; k++)
tomax(ans, f[N][K][k]);
cout << ans;
return ;
}
/*
3 1 2
1
-1
2
*/
P2331 [SCOI2005]最大子矩阵 (动规:分类讨论状态)的更多相关文章
- 洛谷P2331 [SCOI2005]最大子矩阵 DP
P2331 [SCOI2005]最大子矩阵 题意 : 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 第一行为n,m,k(1≤n≤ ...
- 洛谷P2331 [SCOI2005] 最大子矩阵[序列DP]
题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k(1≤n≤100,1≤m≤2 ...
- luogu P2331 [SCOI2005]最大子矩阵
传送门 \[\huge\mathit{warning}\] \[\small\text{以下说明文字高能,请心脏病,,,,,,人士谨慎观看,请未成年人在家长陪同下观看}\] 皮这一下很开心 其实是代码 ...
- 洛谷 P2331 [SCOI2005]最大子矩阵
洛谷 这一题,乍一眼看上去只想到了最暴力的暴力--大概\(n^4\)吧. 仔细看看数据范围,发现\(1 \leq m \leq 2\),这就好办了,分两类讨论. 我先打了\(m=1\)的情况,拿了30 ...
- P2331 [SCOI2005]最大子矩阵
题目描述 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 输入输出格式 输入格式: 第一行为n,m,k(1≤n≤100,1≤m≤2 ...
- 洛谷P2331[SCOI2005]最大子矩阵
题目 DP 此题可以分为两个子问题. \(m\)等于\(1\): 原题目转化为求一行数列里的\(k\)块区间的和,区间可以为空的值. 直接定义状态\(dp[i][t]\)表示前i个数分为t块的最大值. ...
- 【BZOJ1088】[SCOI2005] 扫雷Mine(分类讨论)
点此看题面 大致题意: 给你一个\(2*n\)的扫雷棋盘,现让你根据第二列的信息确定第一列有多少种摆法. 扫雷性质 听说这是一道动态规划+数学题. 其实,根据扫雷游戏的某个性质,只要确定了第一个格子是 ...
- [bzoj1084][SCOI2005]最大子矩阵_动态规划_伪·轮廓线dp
最大子矩阵 bzoj-1084 SCOI-2005 题目大意:给定一个n*m的矩阵,请你选出k个互不重叠的子矩阵使得它们的权值和最大. 注释:$1\le n \le 100$,$1\le m\le 2 ...
- 1084: [SCOI2005]最大子矩阵
1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1325 Solved: 670[Submit][Stat ...
随机推荐
- Java 类名.class与类名.this 的区别?
“类名.this”的语法在Java语言中叫做“qualified this”.相关规定在这里:Chapter 15. Expressions - Qualified this这个语法的主要用途是:在内 ...
- 随机数类Random
我们来学习下,用来产生随机数的类Random,它也属于引用数据类型. 这个Random类,它可以产生多种数据类型的随机数,在这里我们主要介绍生成整数与小数的方式. l 方法简介 public int ...
- Oracle中如何查询一个表的所有字段名和数据类型
Oracle中如何查询一个表的所有字段名和数据类型 查询语法 select A.COLUMN_NAME,A.DATA_TYPE from user_tab_columns A where TABLE_ ...
- Nginx的Access日志记录的时机
想当然了,所以犯了一个低级的错误... nginx的access访问日志可以记录下访问到nginx的相关信息.包含请求地址,请求路径,返回码,请求的处理时间等信息.. 然后问题来了,这个日志是什么时候 ...
- 通过AssemblyResolve事件打包合并exe和dll文件
使用WPF开发的安装包,在创建快捷方式的时候,需要用到COM程序集Windows Script Host Object Model,引用COM程序集后,会在debug目录生成Interop.IWshR ...
- css3 min-content,max-content,fit-content, fill属性
css3里有四个属性,用来实现以内容为主的尺寸计算方式,intrinsic sizing min-content max-content fit-content fill 其中 fill 关键字,需要 ...
- shell 字符串判断
字符串的判断 '-z 字符串' 判断字符串是否为空(为空返回真) '-n 字符串' 判断字符串是否为非空(非空返回真) '字符串1==字符串2' 判断字符串1是否和字符串2相等(相等返回真) '字符串 ...
- Win10系列:VC++绘制几何图形5
打开D2DBasicAnimation.h头文件,并在D2DBasicAnimation类中添加如下的代码: private: //声明成员变量point D2D1_POINT_2F ...
- ppt点击文字出现图片,再次点击消失
实现效果:在PPT一个页面的任意位置,单击左键,出现图片:在图片上,单击左键,图片消失 实现思路:给图片做两个动画,一个进入,文字作触发器,另一个退出,图片本身为触发器. 实现方法: 1.选中图片…… ...
- core net 实现post 跟get
using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using Syst ...