最大和
来源:互联网 发布:gtap数据库 编辑:程序博客网 时间:2024/04/30 00:05
最大和
时间限制:1000 ms | 内存限制:65535 KB
难度:5
- 描述
给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。
例子:
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2
其最大子矩阵为:9 2
-4 1
-1 8
其元素总和为15。- 输入
- 第一行输入一个整数n(0<n<=100),表示有n组测试数据;
每组测试数据:
第一行有两个的整数r,c(0<r,c<=100),r、c分别代表矩阵的行和列;
随后有r行,每行有c个整数; - 输出
- 输出矩阵的最大子矩阵的元素之和。
- 样例输入
14 40 -2 -7 0 9 2 -6 2 -4 1 -4 1 -1 8 0 -2
- 样例输出
15
思路:最大的矩阵在行与行之间,可能是第一行与第二行之间的子矩阵,可能是第一行与第2,3,4,5....n行之间的子矩阵,然后求每个矩阵的最大子矩阵和
#include<stdio.h>#include<string.h> int a[101][101]; int b[101][101]; int c[101]; int c1[101]; int we(int a1,int c1[])//求和最大的子串{int sum1=0; int sum2=0; for(int j=1; j<=a1; j++) { if(sum1>=0)//注意这个地方,只有当sum1>0的时候才加 { sum1+=c1[j]; } else { sum1=c1[j]; } if(sum1>sum2) { sum2=sum1; } //printf("****%d ",sum1); } return sum2;}int main(){ int t; scanf("%d",&t); while(t--) { int n,m; int sum; int maxn=-1000000000; scanf("%d%d",&n,&m); int ni=-1000000000; for(int i=1; i<=n; i++) { for(int j=1; j<=m; j++) { scanf("%d",&a[i][j]); if(a[i][j]>ni) { ni=a[i][j]; } } } if(ni<0)//当最大的值《0的时候输出最大的负数,而不是0 { printf("%d\n",ni); } else { for(int i=1; i<=n; i++) { memset(b,0,sizeof(b)); memset(c,0,sizeof(c)); for(int j=i; j<=n; j++) { for(int k=1; k<=m; k++) { b[i][k]+=a[j][k];//相当于把多个行合并成一行,然后算这行的最大的子串和 c[k]=b[i][k]; } sum=we(m,c); if(sum>maxn) { maxn=sum; } } } printf("%d\n",maxn); } }}
0 0
- 最大和
- 最大和
- 最大和
- 最大和
- 最大和
- 最大和
- 最大和
- 最大和
- 最大和
- 最大和
- 最大和
- 最大和
- 最大和
- 最大子矩阵的和 最大和
- 最大连续和
- 递归求最大和
- 最大子段和
- hdu1231 最大字段和
- CSS3rem自适应
- 更改tomcat端口8080为80的时候,有系统端口占用的问题
- 不需要再纠结 JAVA 的效率问题!
- 负载均衡
- 红米note3 Failure [INSTALL_CANCELED_BY_USER]
- 最大和
- Spring中基于Java的配置@Configuration和@Bean用法
- 编程修养(六)
- Linux查看CPU和内存使用情况
- 正则表达式
- matlab中贝叶斯简单使用
- 7个故事搞懂互联网思维
- 解决windows server 2008 r2 安装钉钉客户端缺少wlanapi.dll文件的提示
- Android事件分发机制