bzoj千题计划198:bzoj1084: [SCOI2005]最大子矩阵
2024-09-17 09:00:07
http://www.lydsy.com/JudgeOnline/problem.php?id=1084
m=1:
dp[i][j] 前i个数,选了j个矩阵的最大和
第i个不选:由dp[i-1][j]转移
第i个选:枚举i所在矩阵的左端点k,由dp[k][j-1]转移
m=2:
dp[i][j][k] 第1行前i个,第2行前j个,选了k个矩阵的最大和
2行都不选:dp[i-1][j-1][k]
只选第1行:枚举i所在矩阵的左端点h,由dp[h][j][k-1]转移
只选第2行:枚举j所在矩阵的左端点h,由dp[i][h][k-1]转移
如果i=j,2行都选:每局矩阵左端点h,由dp[h][h][k-1]转移
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm> using namespace std; #define N 101 int n,m,k; int sum[][N]; int DP[N][],dp[N][N][]; void read(int &x)
{
x=; int f=; char c=getchar();
while(!isdigit(c)) { if(c=='-') f=-; c=getchar(); }
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
x*=f;
} void init()
{
read(n); read(m); read(k);
for(int i=;i<=n;++i)
for(int j=;j<m;++j)
{
read(sum[j][i]);
sum[j][i]+=sum[j][i-];
}
} void DP_()
{
for(int i=;i<=n;++i)
for(int j=;j<=k;++j)
{
DP[i][j]=DP[i-][j];
for(int h=;h<i;++h) DP[i][j]=max(DP[i][j],DP[h][j-]+sum[][i]-sum[][h]);
}
cout<<DP[n][k];
} void dp_()
{
for(int i=;i<=n;++i)
for(int j=;j<=n;++j)
for(int h=;h<=k;++h)
{
dp[i][j][h]=max(dp[i-][j][h],dp[i][j-][h]);
for(int l=;l<i;++l) dp[i][j][h]=max(dp[i][j][h],dp[l][j][h-]+sum[][i]-sum[][l]);
for(int l=;l<j;++l) dp[i][j][h]=max(dp[i][j][h],dp[i][l][h-]+sum[][j]-sum[][l]);
if(i==j)
for(int l=;l<i;++l) dp[i][j][h]=max(dp[i][j][h],dp[l][l][h-]+sum[][i]-sum[][l]+sum[][j]-sum[][l]);
}
cout<<dp[n][n][k];
} int main()
{
init();
if(m==) DP_();
else dp_();
}
1084: [SCOI2005]最大子矩阵
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 3296 Solved: 1641
[Submit][Status][Discuss]
Description
这里有一个n*m的矩阵,请你选出其中k个子矩阵,使得这个k个子矩阵分值之和最大。注意:选出的k个子矩阵
不能相互重叠。
Input
第一行为n,m,k(1≤n≤100,1≤m≤2,1≤k≤10),接下来n行描述矩阵每行中的每个元素的分值(每个元素的
分值的绝对值不超过32767)。
Output
只有一行为k个子矩阵分值之和最大为多少。
Sample Input
3 2 2
1 -3
2 3
-2 3
1 -3
2 3
-2 3
Sample Output
9
最新文章
- UVA-146 ID Codes
- super用法和继承中的构造方法
- GPT分区基础知识
- 关于xampp使用不同端口的虚拟机
- Codeforces Round #349 (Div. 2) D. World Tour (最短路)
- iOS开发——网络编程Swift篇&;(五)同步Post方式
- 开发H5小游戏
- 习惯使用断言Assert
- RADOS工作原理
- SB中使用Autolayout设置到父视图的间距为0
- 关于 this对象 指向问题
- LeetCode 226. Invert Binary Tree (反转二叉树)
- Web Api 过滤器之 AuthorizationFilter 验证过滤器
- 分布式缓存GemFire架构介绍
- CSRFGuard工具介绍
- Nmap的详细使用
- TreeMap - 源代码学习笔记
- plsql 用法和技巧
- ajax Post数据,并得到返回结果,密码加密(Select,checkbox)
- prometheus报警消息钉钉通知
热门文章
- Asp.Net_Mvc3.5语法_<;%%>;的用法
- 金蝶盘点机PDA条码数据采集器WMS系统具体有哪些功能
- ag使用需要注意的问题
- 第二阶段冲刺——five
- MVC 如何设定默认默认路由为指定的Area下的某个action(笔记)
- 从零开始学Kotlin-操作符(3)
- [windows]转帖 windows 版本的含义
- [国家集训队]middle
- 【设计模式】—— 外观模式Facade
- bzoj 4631: 踩气球 线段树合并