和最大连续子串续——和最大连续子矩阵

继上一节学习了和最大连续子串,推广到和最大连续子矩阵,以二维为例,子矩阵是矩阵行和列的组合,参考:http://blog.sina.com.cn/s/blog_a782701501016636.html

代码如下:

package programming;

/**最大和的连续子矩阵
 * 将连续子矩阵看做是一维连续子串,然后利用和最大连续子串方法,求出连续子串,进而求出子矩阵
 * @author ywf
 *
 */
public class MaxSumSubMatrix {

    /**
     * @param args
     */
    public static void main(String[] args) {
        int[][] A =  {{0, -2,  -7,  0},
                  {9 , 2 , -6,  2},
                  {-4 , 1 ,-4 , 1},
                  {-1 , 8 ,  0 ,-2}};
        int[] temp = new int[A[0].length];
        int subMaxSum = Integer.MIN_VALUE;
        int colStart = -1;
        int colEnd = -1;
        int rowStart = -1;
        int rowEnd = -1;
        //矩阵压缩
        for(int i = 0 ;i<A.length;i++){
            for(int j = i;j<A[i].length;j++){
                for(int h = i;h<=j;h++){
                    for(int k = 0;k<temp.length;k++){
                            temp[k] += A[h][k];
                    }
                }
                int[] tempMax = getResult4(temp);
                if(tempMax[2]>subMaxSum){
                    subMaxSum = tempMax[2];
                    colStart = tempMax[0];
                    colEnd = tempMax[1];
                    rowStart = i;
                    rowEnd = j;
                }
                temp = new int[A[0].length];
            }
        }
        //输出和最大子矩阵
        for(int i = rowStart;i<=rowEnd;i++){
            for(int j = colStart;j<=colEnd;j++){
                System.out.print(A[i][j]+" ");
            }
            System.out.println();
        }
        System.out.println("sum:"+subMaxSum);

    }
    public static int[] getResult4(int[] array) {
        int[] result = new int[3];
        int rmax = Integer.MIN_VALUE;//当前最大的和
        int sum = Integer.MIN_VALUE;//当前的和
        int start = -1;//最大子串的起始下标
        int end = -1;//最大子串的结束下标
        for (int i = 0; i < array.length; i++) {
            if (sum > 0) {
                sum += array[i];
            } else {
                sum = array[i];
                if(sum>rmax){
                    start = i;
                }
            }
            if (sum > rmax) {
                rmax = sum;
                end = i;
            }

        }
        result[0] = start;
        result[1] =end ;
        result[2] = rmax;
        return result;
    }
}
时间: 2024-08-27 11:45:41

和最大连续子串续——和最大连续子矩阵的相关文章

poj 3518 Corporate Identity 后缀数组-&gt;多字符串最长相同连续子串

题目链接 题意:输入N(2 <= N <= 4000)个长度不超过200的字符串,输出字典序最小的最长公共连续子串; 思路:将所有的字符串中间加上分隔符,注:分隔符只需要和输入的字符不同,且各自不同即可,没有必要是最小的字符; 连接后缀数组求解出height之后二分长度,由于height是根据sa数组建立的,所以前面符合的就是字典序最小的,直接找到就停止即可; ps: 把之前的模板简化了下,A题才是关键; #include<iostream> #include<cstdio&

POJ 3693 Maximum repetition substring (寻找重复次数最多的连续子串)

Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9083   Accepted: 2782 Description The repetition number of a string is defined as the maximum number R such that the string can be partitioned into R same conse

求和最大的连续子串

题目: 给定一整型数字a[]={a[0],...,a[n])},找出连续子串{a[x]),a[x+1],...,a[y]},使得和最大,其中,0<=x<=y<=n. 解法一,用循环来做,扫一遍,用两个变量分别记录当前子序列和.最大的序列和. int LongestSubSum(int a[], int n) { int curSum=0, maxSum=-MaxInt, i; for(i=0; i<n; i++) { curSum += a[i]; if(curSum > m

最长公共连续子串--全国模拟(二)

[编程题] 最长公共连续子串 时间限制:1秒 空间限制:32768K 牛牛有两个字符串(可能包含空格),牛牛想找出其中最长的公共连续子串,希望你能帮助他,并输出其长度. 输入描述: 输入为两行字符串(可能包含空格),长度均小于等于50. 输出描述: 输出为一个整数,表示最长公共连续子串的长度. 输入例子: abcde abgde 输出例子: 2 自己的解题思路:针对两个字符串,定义函数GetEqualCount来求得对于字符串long从L_start开始与字符串short比较得到的最长公共连续子

最大连续子串

问题:一个由正数.负数.0组成的序列中,求一个连续子序列,使他们之和最大 解一:暴力法,直接求出所有可能,找出最大值 1 MAX_SEQ_SUM( A, len ) 2 max = A[0] 3 max_b = max_e = 0 4 5 for i -> 0:len-1 6 sum = 0 7 for j->i:len-1 8 if j == i then sum = A[i] 9 else sum += A[i] 10 if sum > max then 11 max = sum 1

UVA 12718 Dromicpalin Substrings(寻找字符串连续子串的回文)

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=4456 题意:寻找给出字符串的字串中是回文的个数(注意:字串中字母换位置后能组成回文也要算在内,例如:aab之类的可以换位置为:aba 也是一个回文). 思路:只需统计每个字母出现的次数,再统计出现次数中

最长连续公共子串、最长公共子串(可以非连续)、最长回文串(连续)、最长回文串(可以不连续)、最长递增数组的求解

问题:最长连续公共子串.最长公共子串(可以非连续).最长回文串(连续).最长回文串(可以不连续).最长递增数组.长方形镶嵌最多的求解 方法:上述问题有相似性,都可以采用动态规划进行求解. (1)最长连续公共子串: 如果A[i]==B[j], dp[i][j]=dp[i-1][j-1]+1; 否则,dp[i][j]=0; (2)最长公共子串(可非连续): 如果A[i]==B[j], dp[i][j]=dp[i-1][j-1]+1; 否则,dp[i][j]=dp[i-1][j-1]; (3)最长回文

3 Longest Substring Without Repeating Characters(最长不重复连续子串Medium)

题目意思:求字符串中,最长不重复连续子串 思路:使用hashmap,发现unordered_map会比map快,设置一个起始位置,计算长度时,去减起始位置的值 eg:a,b,c,d,e,c,b,a,e 0 1 2 3 4 0 1 5 3 4 0 6 5 3 4 7 6 5 3 4 7 6 5 3 8 再次出现c时,将start值置为map[c]+1=3,对于下一个b,因为map[b]<start,则直接map[b]=i 1 class Solution { 2 public: 3 int len

最大连续子序列之和,最大连续子序列乘积

最大连续子序列之和问题描述为:数组中里有正数也有负数,连续的一个或多个整数组成一个子数组,每个子数组都有一个和,求所有子数组的和的最大值.分析,对数组a进行一遍扫描,sum[i] 为前i个元素中,包含第i个元素且和最大的连续子数组,MaxSum保存当前子数组中最大和,对于a[i+1]来说,sum[i+1] = sum[i]+a[i+1],此时如果sum[i+1]<0,那么sum需要重新赋0,从i+1之后开始累加,如果sum[i+1]>0,那么MaxSum = max(MaxSum, Sum[i