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
2
-4
1
-1
8
其元素总和为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);
}
}
}
相关文章推荐
- NYOJ 104 矩阵最大和 - 简单动态规划
- NYOJ 104 最大和 和POJ 1050 To the Max【动态规划】
- (NYoj 104)最大和 --二维最大连续子串和转化为一维,动态规划
- 【POJ1050】To the Max (动态规划、最大字串和、最大子矩阵和)||NYOJ44 ||NYOJ104
- NYOJ 104 最大和
- nyoj 104 最大和(子矩阵最大和)(枚举)
- NYOJ 104 最大和
- NYOJ - 745 - 蚂蚁的难题(二)(最大子序列和变形,动态规划)
- nyoj 104——最大和——————【子矩阵最大和】
- hdu 1024 最大M子段和 Max Sum Plus Plus(dp)(中等难度)
- NYOJ 104(最大子矩阵和)
- NYOJ 104-最大和【模板:最大子阵和】
- nyoj 104 最大和(子矩阵最大和)(枚举)
- NYOJ 104 最大和(求最大子矩阵)
- NYOJ104 最大和
- 最大和 NYOJ——104
- nyoj-104 最大和 (枚举+动态规划)
- nyoj 104 最大和(子矩阵最大和)(枚举)
- NYOJ-104最大和
- nyoj 104 最大和(子矩阵最大和)(枚举)