您的位置:首页 > 其它

nyoj104最大和--中等难度--动态规划

2013-12-10 23:17 246 查看


最大和

时间限制:1000 ms  |  内存限制:65535 KB
难度:5

描述

给定一个由整数组成二维矩阵(r*c),现在需要找出它的一个子矩阵,使得这个子矩阵内的所有元素之和最大,并把这个子矩阵称为最大子矩阵。 

例子:
0 -2 -7 0 
9
2 -6 2 
-4
1 -4 1 
-1 8 0 -2 
其最大子矩阵为:

9

-4

-1

其元素总和为15。 

输入第一行输入一个整数n(0<n<=100),表示有n组测试数据;

每组测试数据:

第一行有两个的整数r,c(0<r,c<=100),r、c分别代表矩阵的行和列;

随后有r行,每行有c个整数;

输出输出矩阵的最大子矩阵的元素之和。
样例输入
1
4 4
0 -2 -7 0
9 2 -6 2
-4 1 -4 1
-1 8 0 -2


样例输出
15


来源[苗栋栋]原创
上传者苗栋栋

import java.util.Scanner;

public class nyoj104矩阵最大和 {
public static void main(String[] args) {

Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
while (N-- > 0) {
int n = sc.nextInt();
int m = sc.nextInt();
int[][] a = new int[n + 10][m + 10];
int i, j, k, sum;
for (i = 1; i <= n; i++)
for (j = 1; j <= m; j++)
a[i][j] = sc.nextInt();

int max = -20000;
for (i = 1; i <= n; i++) { // //n行
int[] b = new int[m + 10];
for (j = i; j <= n; j++) { // 范围逐渐缩小由(1-->n,2-->n,3-->n....n-1-->n,n-->n)
for (k = 1, sum = 0; k <= m; k++) { // 每一行上遍历,而且是将 i行
// 以后的所有行对应的向每一列相加起来
b[k] += a[j][k]; // //将 i行
// 以后的所有行对应的向每一列相加起来,b[k]加的矩阵上的元素越来越多起来,并不一定越来越大
sum += b[k]; // 在这连续的动态的几行里对应的没列上的和加在sum上
if (max < sum) // 每一次都比较,并刷新max的值使其最大
max = sum;
if (sum < 0)
sum = 0; // sum=0时舍弃以前的累加值,因为他是求连续的行或者列的子矩阵的最大和,
}
}
}
System.out.println(max);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: