洛谷P2331 [SCOI2005]最大子矩阵 DP
题意 :
这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵不能相互重叠。
第一行为n,m,k(1≤n≤100,1≤m≤2,1≤k≤10),接下来n行描述矩阵每行中的每个元素的分值(每个元素的分值的绝对值不超过32767)。
思路:
注意这里的m只可能为1或者2.所以可以分开来考虑,对于m = 1,比较容易,dp[i][k] = dp[ t ][ k-1 ] + (t 到 i 的和)。然而对于m等于2的情况,我们可以开一个dp[ i ][ j ][ k ]. 表示第一行取前i个,第二行取前j个,取k个矩阵的最大值。那么就可以转移,当i!=j时,只可能是第一行的t推到 i 个,或者是第二行的t推到第 j 个,而当i == j时,还要考虑一个占两行的矩阵推移情况。
1)子矩阵可以为空矩阵。
2) 程序较大,容易写错下标,数组不要开小了。
#include <algorithm>
#include <iterator>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <iomanip>
#include <bitset>
#include <cctype>
#include <cstdio>
#include <string>
#include <vector>
#include <stack>
#include <cmath>
#include <queue>
#include <list>
#include <map>
#include <set>
#include <cassert> using namespace std;
#define lson (l , mid , rt << 1)
#define rson (mid + 1 , r , rt << 1 | 1)
#define debug(x) cerr << #x << " = " << x << "\n";
#define pb push_back
#define pq priority_queue typedef long long ll;
typedef unsigned long long ull;
//typedef __int128 bll;
typedef pair<ll ,ll > pll;
typedef pair<int ,int > pii;
typedef pair<int,pii> p3; //priority_queue<int> q;//这是一个大根堆q
//priority_queue<int,vector<int>,greater<int> >q;//这是一个小根堆q
#define fi first
#define se second
//#define endl '\n' #define OKC ios::sync_with_stdio(false);cin.tie(0)
#define FT(A,B,C) for(int A=B;A <= C;++A) //用来压行
#define REP(i , j , k) for(int i = j ; i < k ; ++i)
#define max3(a,b,c) max(max(a,b), c);
#define min3(a,b,c) min(min(a,b), c);
//priority_queue<int ,vector<int>, greater<int> >que; const ll mos = 0x7FFFFFFF; //
const ll nmos = 0x80000000; //-2147483648
const int inf = 0x3f3f3f3f;
const ll inff = 0x3f3f3f3f3f3f3f3f; //
const int mod = 1e8+;
const double esp = 1e-;
const double PI=acos(-1.0);
const double PHI=0.61803399; //黄金分割点
const double tPHI=0.38196601; template<typename T>
inline T read(T&x){
x=;int f=;char ch=getchar();
while (ch<''||ch>'') f|=(ch=='-'),ch=getchar();
while (ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
return x=f?-x:x;
} /*-----------------------showtime----------------------*/ const int maxn = ;
int mp[maxn][];
int dp[maxn][maxn][];
int s[][maxn];
int a[maxn][];
int main(){
int n,m,k;
scanf("%d%d%d", &n, &m, &k);
for(int i=; i<=n ;i++){
for(int j=; j<=m ; j++)
scanf("%d", &mp[i][j]);
} for(int i=; i<=m; i++){
for(int j=; j<=n; j++){
s[i][j] = s[i][j-] + mp[j][i];
}
} if(m == ){
int ans = ;
for(int i=; i<=n; i++){
for(int j=; j<=k; j++){
a[i][j] = a[i-][j];
for(int t=; t<i; t++)
{
a[i][j] = max(a[i][j], a[t][j-] + s[][i] - s[][t]);
}
ans = max(ans, a[i][j]);
}
}
printf("%d", ans );
}
else {
int ans = ;
for(int i=; i<=n; i++){
for(int j=; j<=n; j++){
for(int t = ; t <= k; t++){
dp[i][j][t] = max(dp[i-][j][t], dp[i][j-][t]);
for(int q = ; q < i; q ++)
dp[i][j][t] = max(dp[i][j][t], dp[q][j][t-] + s[][i] - s[][q]);
for(int q = ; q < j; q ++)
dp[i][j][t] = max(dp[i][j][t], dp[i][q][t-] + s[][j] - s[][q]); if(i==j){
for(int q=; q<i; q ++)
dp[i][j][t] = max(dp[i][j][t], dp[q][q][t-] + s[][i] + s[][i] - s[][q] - s[][q]);
}
ans = max(ans, dp[i][j][t]);
}
}
}
printf("%d\n", ans);
}
return ;
}
P2331
洛谷P2331 [SCOI2005]最大子矩阵 DP的更多相关文章
- 洛谷 P2331 [SCOI2005]最大子矩阵
		
洛谷 这一题,乍一眼看上去只想到了最暴力的暴力--大概\(n^4\)吧. 仔细看看数据范围,发现\(1 \leq m \leq 2\),这就好办了,分两类讨论. 我先打了\(m=1\)的情况,拿了30 ...
 - 洛谷P2331 [SCOI2005] 最大子矩阵[序列DP]
		
题目描述 这里有一个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块的最大值. ...
 - BZOJ1084或洛谷2331 [SCOI2005]最大子矩阵
		
BZOJ原题链接 洛谷原题链接 注意该题的子矩阵可以是空矩阵,即可以不选,答案的下界为\(0\). 设\(f[i][j][k]\)表示前\(i\)行选择了\(j\)个子矩阵,选择的方式为\(k\)时的 ...
 - bzoj1084&&洛谷2331[SCOI2005]最大子矩阵
		
题解: 分类讨论 当m=1的时候,很简单的dp,这里就不再复述了 当m=2的时候,设dp[i][j][k]表示有k个子矩阵,第一列有i个,第二列有j个 然后枚举一下当前子矩阵,状态转移 代码: #in ...
 - 洛谷 P1896 [SCOI2005]互不侵犯
		
洛谷 P1896 [SCOI2005]互不侵犯 题目描述 在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案.国王能攻击到它上下左右,以及左上左下右上右下八个方向上附近的各一个格子,共8 ...
 - 洛谷 P5279 - [ZJOI2019]麻将(dp 套 dp)
		
洛谷题面传送门 一道 dp 套 dp 的 immortal tea 首先考虑如何判断一套牌是否已经胡牌了,考虑 \(dp\).我们考虑将所有牌按权值大小从大到小排成一列,那我们设 \(dp_ ...
 - 【题解】洛谷P1896 [SCOI2005] 互不侵犯(状压DP)
		
洛谷P1896:https://www.luogu.org/problemnew/show/P1896 前言 这是一道状压DP的经典题 原来已经做过了 但是快要NOIP 复习一波 关于一些位运算的知识 ...
 - BZOJ 1084: [SCOI2005]最大子矩阵 DP
		
1084: [SCOI2005]最大子矩阵 题目连接: http://www.lydsy.com/JudgeOnline/problem.php?id=1084 Description 这里有一个n* ...
 
随机推荐
- Git/Github使用方法小记
			
今天把人间网的桌面客户端renjian-deck正式开源了,之前对javascript的了解其实非常的不够的,所以这一次的代码写的也是乱七八糟重用性及其低下,虽然我无数次的想把代码重新整理一下,不过还 ...
 - Codeforces Round #192 (Div. 2) (330B) B.Road Construction
			
题意: 要在N个城市之间修建道路,使得任意两个城市都可以到达,而且不超过两条路,还有,有些城市之间是不能修建道路的. 思路: 要将N个城市全部相连,刚开始以为是最小生成树的问题,其实就是一道简单的题目 ...
 - GC是什么?为什么我们要去使用它
			
GC(Garbage Collection)是各大语言的宠儿,也是计算机科学领域里很热门的一个话题.最早在JVM中有看过这个算法,后来发现即使是js这种脚本语言也是有GC的.单纯就JVM来说的话,GC ...
 - Python基础总结之初步认识---clsaa类(上)。第十四天开始(新手可相互督促)
			
最近的类看着很疼,坚持就是胜利~~~ python中的类,什么是类?类是由属性和方法组成的.类中可能有很多属性,以及方法. 我们这样定义一个类: 前面是class关键字 后面school是一个类的名字 ...
 - alluxio源码解析-rpc调用概述(1)
			
alluxio中几种角色以及角色之间的rpc调用: 作为分布式架构的文件缓存系统,rpc调用必不可少 client作为客户端 master提供thrift rpc的服务,管理以下信息: block信息 ...
 - 精准测试与开源工具Jacoco的覆盖率能力大PK
			
导读:本文根据实际使用情况,简要分析了精准测试和类Jacoco等传统白盒工具在设计理念.功能和应用场景的异同点,并阐述了覆盖率技术如何在新型企业开发体系中,发挥应有的重要作用. 覆盖率技术可以说是测试 ...
 - 鲜为人知的maven标签解说
			
目录 localRepository interactiveMode offline pluginGroups proxies servers mirrors profiles 使用场景 出现位置 激 ...
 - 如何调教你的博客Episode2——移动端支持和UI美化
			
这个系列的文章是我在搭建博客园博客时所经历的过程. 在上一期如何调教你的博客Episode1——修改整体样式中,我们通过添加CSS样式,修改了页面的总体布局.但将文章发出之后,博客的布局就出现问题了: ...
 - Go语言框架:Beego vs Gin 的区别
			
前言: 一切语言.技术或者框架,本质都是工具,工具的价值在于为使用者提供竞争优势. 一.Beego和Gin全方位比较 MVC Beego支持完整的MVC, Gin不支持完整的MVC(需要开发者自己实现 ...
 - jmeter学习笔记-----第一天
			
环境简介:apache-jmeter-3.3 win10系统 一.Jmeter录制操作步骤: 1.工作台---添加HTTP代理服务器: 2.为自己笔记本的浏览器设置相同代理: 3.测试计划下-s ...