[BZOJ 1084] [SCOI2005] 最大子矩阵 【DP】
题目链接:BZOJ - 1084
题目分析
我看的是神犇BLADEVIL的题解。
1)对于 m = 1 的情况, 首先可能不取 Map[i][1],先 f[i][k] = f[i - 1][k]; 再考虑取一段新的的情况,用 max(f[j][k - 1] + Sum[i][1] - Sum[j][1]) (0 <= j < i) 更新 f[i][j];
2) 对于 m = 2 的情况,用 f[i][j][k] 表示左列取到第 i 个,右列取到第 j 个,共 k 个矩形的最优值。
首先还是可能不取新的矩形,那么 f[i][j][k] = max(f[i - 1][j][k], f[i][j - 1][k]);
之后可能左列取一个新的矩形,用 max(f[ii][j][k - 1] + Sum[i][1] - Sum[ii][1]) (0 <= ii < i) 更新 f[i][j][k];
可能在右列取一个新的矩形,用 max(f[i][jj][k - 1] + Sum[j][2] - Sum[jj][2]) (0 <= jj < j) 更新 f[i][j][k];
若 i == j, 那么可能取一个跨两列的矩形,用 max(f[ii][ii][k - 1] + Sum[i][1] + Sum[i][2] - Sum[ii][1] - Sum[ii][2]) (0 <= ii < i) 更新 f[i][j][k];
代码
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <algorithm>
#include <cmath> using namespace std; const int MaxN = 100 + 5, MaxK = 10 + 5; int n, m, EK;
int Map[MaxN][3], Sum[MaxN][3], f1[MaxN][MaxK], f2[MaxN][MaxN][MaxK]; inline int gmax(int a, int b) {return a > b ? a : b;}
inline int gmin(int a, int b) {return a < b ? a : b;} int main()
{
scanf("%d%d%d", &n, &m, &EK);
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= m; ++j) {
scanf("%d", &Map[i][j]);
Sum[i][j] = Sum[i - 1][j] + Map[i][j];
}
}
if (m == 1) {
for (int i = 1; i <= n; ++i) {
for (int k = 1; k <= EK; ++k) {
f1[i][k] = f1[i - 1][k];
for (int j = 0; j < i; ++j) {
f1[i][k] = gmax(f1[i][k], f1[j][k - 1] + Sum[i][1] - Sum[j][1]);
}
}
}
printf("%d\n", f1[n][EK]);
}
else {
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= n; ++j) {
for (int k = 1; k <= EK; ++k) {
f2[i][j][k] = gmax(f2[i - 1][j][k], f2[i][j - 1][k]);
for (int jj = 0; jj < i; ++jj)
f2[i][j][k] = gmax(f2[i][j][k], f2[jj][j][k - 1] + Sum[i][1] - Sum[jj][1]);
for (int jj = 0; jj < j; ++jj)
f2[i][j][k] = gmax(f2[i][j][k], f2[i][jj][k - 1] + Sum[j][2] - Sum[jj][2]);
if (i == j) {
for (int jj = 0; jj < i; ++jj)
f2[i][j][k] = gmax(f2[i][j][k], f2[jj][jj][k - 1] + Sum[i][1] + Sum[i][2] - Sum[jj][1] - Sum[jj][2]);
}
}
}
}
printf("%d\n", f2[n][n][EK]);
}
return 0;
}
[BZOJ 1084] [SCOI2005] 最大子矩阵 【DP】的更多相关文章
- BZOJ 1084: [SCOI2005]最大子矩阵 DP
1084: [SCOI2005]最大子矩阵 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1084 Description 这里有一个n* ...
- bzoj 1084: [SCOI2005]最大子矩阵【dp】
分情况讨论,m=1的时候比较简单,设f[i][j]为到i选了j个矩形,前缀和转移一下就行了 m=2,设f[i][j][k]为1行前i个,2行前j个,一共选了k个,i!=j的时候各自转移同m=1,否则转 ...
- BZOJ 1084 [SCOI2005]最大子矩阵 - 动态规划
传送门 题目大意: 从矩阵中取出k个互不重叠的子矩阵,求最大的和. 题目分析: 对于m=1,直接最大m子段和. 对于m=2: \(dp[i][j][k]\)表示扫描到第一列i和第2列j时选取了k个矩阵 ...
- BZOJ: 1084: [SCOI2005]最大子矩阵
NICE 的DP 题,明白了题解真是不错. Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1228 Solved: 622[Submit][Stat ...
- 【BZOJ 1084】 1084: [SCOI2005]最大子矩阵 (DP)
1084: [SCOI2005]最大子矩阵 Description 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. Input 第 ...
- BZOJ(6) 1084: [SCOI2005]最大子矩阵
1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3566 Solved: 1785[Submit][Sta ...
- 1084: [SCOI2005]最大子矩阵
1084: [SCOI2005]最大子矩阵 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1325 Solved: 670[Submit][Stat ...
- Bzoj 1088: [SCOI2005]扫雷Mine (DP)
Bzoj 1088: [SCOI2005]扫雷Mine 怒写一发,算不上DP的游戏题 知道了前\(i-1\)项,第\(i\)项会被第二列的第\(i-1\)得知 设\(f[i]\)为第一列的第\(i\) ...
- 洛谷P2331 [SCOI2005]最大子矩阵 DP
P2331 [SCOI2005]最大子矩阵 题意 : 这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大.注意:选出的k个子矩阵不能相互重叠. 第一行为n,m,k(1≤n≤ ...
随机推荐
- JS方法在iframe父子窗口间的调用
本文向大家简单介绍一下iframe父子窗口间JS方法调用,JavaScript 被数百万计的网页用来改进设计.验证表单.检测浏览器.创建cookies,以及更多的应用,希望本文介绍对你有所帮助. if ...
- 腾讯QQ企业邮箱POP3/SMTP设置
腾讯企业邮箱支持通过client进行邮件管理. POP3/SMTP协议 收发邮件server地址分别例如以下. 接收邮件server:pop.exmail.qq.com (port 110) 发送邮件 ...
- FastJson解析对象及对象数组--项目经验
第一次使用json,解析工具为FastJson,使用语言为java 常见的json解析实例,以map为例: Map<String,String> map=new HashMap<St ...
- 第二篇:从 GPU 的角度理解并行计算
前言 本文从使用 GPU 编程技术的角度来了解计算中并行实现的方法思路. 并行计算中需要考虑的三个重要问题 1. 同步问题 在操作系统原理的相关课程中我们学习过进程间的死锁问题,以及由于资源共享带来的 ...
- Android绘制流程
一.前言 1.1.C++界面库 MFC.WTL.DuiLib.QT.Skia.OpenGL.Android里面的画图分为2D和3D两种: 2D是由Skia 来实现的,3D部分是由OpenGL实现的. ...
- 一次优化web项目的经历记录(三)
一次优化web项目的经历记录 这段时间以来的总结与反思 前言:最近很长一段时间没有更新博客了,忙于一堆子项目的开发,严重拖慢了学习与思考的进程. 开水倒满了需要提早放下杯子,晚了就会烫手,这段时间以来 ...
- VBA开发中的前绑定与后绑定
凡是能用createobject创建的对象,都可以在引用相对应的运行库(library)文件之后在对象浏览器中得到它的方法.属性.枚举和事件列表,比如Shell.Application对象在Shell ...
- ASP.NET MVC 中 ActionResult 和 ViewResult 在使用上的区别
如果确认你返回的是一个视图(view),你可以直接返回类型为ViewResult. 如果你并不是很清楚,或者你根本不想去理解这些东西,你可以直接返回ActionResult
- ActionResult 常见问题
1:在Asp.net Mvc 2中由于对数据的保护,当返回类型为JsonResult时 ,默认情况下request需要为post.(可使用 return Json(person,JsonReque ...
- AndroidManifest.xml中data标签中所有属性的含义
属性(ATTRIBUTES): android:host 这个属性用户定义URI授权的主机部分,除非给过滤器也指定了<data>元素的scheme属性,否则这个属性没有意义. 注意:在An ...