博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
noi 1768 最大子矩阵
阅读量:6793 次
发布时间:2019-06-26

本文共 1879 字,大约阅读时间需要 6 分钟。

题目链接:

可能是数据修改了吧,O(n6)过不了了。

主要是在求一个矩阵的和时,重复计算了很多次。

矩阵首先压缩一下。在输入的时候,就计算好每一列的和于a[i][j]中。

dp:

枚举上界(第一重循环),枚举下界(第二重循环),枚举列数(第三重循环),总的时间复杂度为O(n3);

怎么得到这一列的和呢? 就是利用预处理的 a 数组。temp= a[j][k] - a[i-1][k];

然后这一列上的 dp 方程 f[k] = max(f[k-1]+temp,temp);  //选还是不选这一列;

temp2 = max(f[k]) 是这一列的最优值。循环完后,就是 ans = max(temp2) 只一个区间的最优值了。

/*#include
using namespace std;#define INF 0x3f3f3f3fconst int Maxn = 110;int a[Maxn][Maxn];int main(){ int n; cin>>n; for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) cin>>a[i][j]; int ans = -INF; int sum = 0; for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { for(int r=i; r<=n; r++) { for(int c=j; c<=n; c++) { sum = 0; for(int k=i;k<=r;k++) { for(int t=j;t<=c;t++) { sum +=a[k][t]; } } if(sum>ans) ans = sum; } } } } cout<
<
using namespace std;const int INF = 0x3f3f3f3f;const int Maxn = 110;int a[Maxn][Maxn];int f[Maxn];int n;int main(){ int ans = -INF; scanf("%d",&n); for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { scanf("%d",&a[i][j]); a[i][j] +=a[i-1][j]; } for(int i=1; i<=n; i++) { for(int j=i; j<=n; j++) { memset(f,0,sizeof(f)); int temp1 = -INF; for(int k=1; k<=n; k++) { int temp2 = a[j][k] - a[i-1][k]; f[k] = max(f[k-1]+temp2,temp2); temp1 = max(temp1,f[k]); } ans = max(ans,temp1); } } printf("%d\n",ans); return 0;}

 

转载于:https://www.cnblogs.com/TreeDream/p/6028227.html

你可能感兴趣的文章
13-JS中的面向对象
查看>>
[转载]LeetCode: Gray Code
查看>>
Ubuntu 16.04 安装摄像头驱动usb_cam
查看>>
11.23
查看>>
优达学城数据分析师纳米学位——知识点总结2
查看>>
GitHub使用
查看>>
9.react 从入门到放弃
查看>>
(五)UML之协作图
查看>>
es聚合学习笔记
查看>>
JAVA 浮点数转化为百分数,分离整数和小数部分 分类: Java ...
查看>>
从零开始搭建支持http2的web服务
查看>>
.Net 调用中国气象台Web Service
查看>>
BNU 51002 BQG's Complexity Analysis
查看>>
leetcode 7. Reverse Integer
查看>>
VC++6.0 自定义按钮,无标题对话框的拖动方法
查看>>
Ubuntu下 安装 window 虚拟机
查看>>
Urxvt最简配置
查看>>
JAVA-基础(线程)
查看>>
[转载]C#中使用ADO.NET连接SQL Server数据库,自动增长字段用作主键,处理事务时的基本方法...
查看>>
一个图片无限循环上下运动实例
查看>>