听课笔记--DP--最大子矩阵和
2024-10-06 14:08:21
最大子矩阵问题
给定一个n*n(0<n<=120)的矩阵,
矩阵内元素有正有负,
请找到此矩阵的内部元素和最大的子矩阵
样例输入:
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
样例输出:
15
方法一:
用二维前缀和维护然后一个个点遍历;
时间复杂度:O(N4);
方法二:
DP
先请明白这道题:
嗯?这不是一维的吗。和这道题有什么关系?
请看这张图:
这样就不难看出,我们只要枚举区间的左端点l和右端点r; 同时用维护的二维前缀和求出每一段1,2,3,4,的值 然后竖着来一遍最大字段和(O(N))就好了 时间复杂度:O(N3)
代码:
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn=150;
int a[maxn][maxn];
int sum[maxn][maxn];
int line[maxn],c[maxn];
int l,r;
int n;
int solve()
{
int minx=min(0,line[1]),maxx=line[1];//
for(int i=2;i<=n;i++)
{
maxx=max(maxx,c[i]-minx);
minx=min(minx,c[i]);
}
return maxx;
}
int main()
{
int ans=-99999;
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
cin>>a[i][j];
sum[i][j]=sum[i][j-1]+a[i][j];
}
}
for(r=1;r<=n;r++)
{
for(l=1;l<=r;l++)
{
for(int i=1;i<=n;i++)
{
line[i]=sum[i][r]-sum[i][l]+a[i][l];
c[i]=c[i-1]+line[i];
}
ans=max(solve(),ans);
memset(c,0,sizeof(c));
memset(line,0,sizeof(line));
}
}
cout<<ans<<endl;
return 0;
}
最新文章
- asp.net-枚举绑定控件
- CSS Bug
- sdut1598 周游列国【简单模拟题】
- PHP获取Cookie模拟登录CURL
- thymeleaf条件表达式
- 建议别买三星Gear:半电脑产品 设计糟糕
- Oracle 11g 完全卸载
- 转:MVC分页
- HDU 3081Marriage Match II(二分法+并检查集合+网络流量的最大流量)
- Redis数据结构及相应的命令
- Swift语言指南(二)--语言基础之注释和分号
- 如何高效实现扫描局域网IP、主机名、MAC和端口
- 微信小程序(一)基本知识初识别
- jQuery Ajax跨域问题简易解决方案
- Django ORM那些相关操作
- MyCP.java蓝墨云班课
- 有关CSS的overflow和border-radius的那些事,你的圆角被覆盖了吗?
- 【原创】大叔经验分享(48)oozie中通过shell执行impala
- C#基础知识之面向对象以及面向对象的三大特性
- UnzipUtil
热门文章
- https://en.wikipedia.org/wiki/Green_threads
- VUE知识点小记
- Android向系统日历添加日程提醒事件
- ES6深入浅出-2 新版函数:箭头函数 2 视频-2.视频 箭头函数杂谈
- 本地git仓库推送到服务器自建的git仓库实现目录文件同步教程
- 123457123456#0#-----com.threeapp.renZheDadishu02-----忍者版打地鼠
- PAT 甲级 1036 Boys vs Girls (25 分)(简单题)
- 它在 ServiceHost 指令中提供为 Service 特性值,或在配置元素 system.serviceModel/serviceHostingEnvironment/serviceActivations 中提供
- 【Leetcode_easy】686. Repeated String Match
- IDA7.2破解版本