最大子矩阵题解
来源:互联网 发布:linux查看文件权限 编辑:程序博客网 时间:2024/06/06 14:29
题目链接点击打开链接
思路
拿样例来说
4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
一边读入的时候一边求前缀和
for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)scanf("%d",&x),a[i][j]=a[i][j-1]+x;
我们只需要前缀和所以读入的就没有了,另外开一个数组也可以然后这个4*4的a[i][j]矩阵变成了
0 -2 -9 -9
9 11 5 7
-4 -3 -7 -6
-1 7 7 5
这样有了前缀和之和我们不必要for一遍求和了,而只要a[w][i]-a[w][j]就可以得到第w行从j+1到i的和
这样子我们首先两个for循环模拟子矩阵的行i=1 to n,j=0 to i-1
这样只是一行所以我们得再for一遍w模拟竖排
把它压缩成了一竖排
a[1][i],a[2][i]...a[w][i]——求最大子串和!
代码附上
#include<algorithm>#include<cstdio>#include<iostream>using namespace std;int main(){int ans=-21000000,a[101][101]={0},tot,x,n,y[101];scanf("%d",&n);for (int i=1;i<=n;i++)for (int j=1;j<=n;j++)scanf("%d",&x),a[i][j]=a[i][j-1]+x;//前缀和for (int i=1;i<=n;i++)for (int j=0;j<i;j++)//模拟行的长度{//memset(y,0,sizeof(y));//这里可以不memset,反正每次处理都是处理前一个处理过的for (int w=1;w<=n;w++){if (a[w][i]+y[w-1]<0) y[w]=0;elsey[w]=y[w-1]+a[w][i]-a[w][j];//a[w][i]-a[w][j]等于a[w][j+1]到a[w][i]的和ans=max(ans,y[w]);}//上面四行求最大子串和,最大子串和也就是小于0的就复制为零,最后取max}printf("%d",ans);}
阅读全文
1 0
- 最大子矩阵 题解
- 最大子矩阵题解
- bzoj 1084: [SCOI2005]最大子矩阵 题解
- 【DP】BZOJ1084(SCOI2005)[最大子矩阵]题解
- 【BZOJ1084】【杂题DP】[SCOI2005]最大子矩阵 题解
- 【题解】最大零矩阵
- NOIP2014P4 子矩阵 题解
- 最大子矩阵问题
- 最大子矩阵模板
- 最大子矩阵问题
- 最大子矩阵问题
- 最大01 子矩阵
- 最大子矩阵问题
- 最大子矩阵
- 最大子矩阵问题
- 最大子矩阵和
- 最大子矩阵问题
- 最大子矩阵问题:
- IPOP-VPN环境搭建,ejabberd XMPP搭建
- F
- 线性表的设计与实现
- CentOS中配置SoftWareRaid磁盘冗余阵列
- Hibernate事务、隔离级别、与并发问题处理(乐观锁与悲观锁)
- 最大子矩阵题解
- 面试小结之Elasticsearch篇
- 快速排序
- ThinkPHP5 模板渲染
- TCP之使用带外数据的客户/服务器
- N皇后问题
- 线性近似
- aapt使用手册
- Kafka的安装和使用总结