动态规划---最大子段和&最大子矩阵和

1.最大子段和

定义数组b[j]用来记录一j为尾的子段和集合中的最大子段和。
由b[j]的定义易知,当b[j-1]>0时,b[j] = b[j-1] + a[j],否则 b[j] = a[j]。
由此可得计算b[j]的动态规划递归式
b[j] = max{ b[j-1] + a[j] , a[j] }, 1<=j<=n.
算法实现:

public class MaxSum {
    public static int maxSum(int[] a){
        int b,sum;
        b=a[0]>0?a[0]:0;
        sum=b;
        for(int j=1;j<a.length;j++){
            if(b>0)
                b+=a[j];
            else 
                b=a[j];
            if(b>sum)
                sum=b;
        }
        return sum; 
    }

    public static void main(String[] args) {
        int sum=maxSum(new int[]{-2,11,-4,13,-5,-2});
        System.out.println("最大子段和="+sum);
    }
}
最大子段和=20

2.最大子矩阵和

如果我们将从第i行到第j行的每一行中相同列的加起来,可以得到一个一维数组,记为b[k],由此我们可以看出最后所求的就是此一维数组的最大子段和问题,枚举从i到j行的所有可能,就可以求出最大矩阵和。
代码实现:

public static int maxMatrix(int[][] array){
        int m=array.length;
        int n=array[0].length;//mxn的矩阵
        int sum1=0;                                                                                                
        int[] b= new int[n];//辅助数组b
        for(int i=0;i<m;i++){
            for(int k=0;k<n;k++){//起始行i变化,重新初始化b[k]
                b[k]=0;
            }
            for(int j=i;j<m;j++){//从第i行到第j行
                for(int k=0;k<n;k++){
                    b[k]+=array[j][k];//b[k]表示数组array第k列,从第i行到第j行的和
                }
                int max1=maxSum(b);//每确定一个i,j,会填充数组b,求得b的最大子段和
                if(max1>sum1)
                    sum1=max1;
            }
        }
        return sum1;
    }
public static void main(String[] args) {
        int[][] array = new int[][]{{0,-2,-7,0},
                                    {9, 2,-6,2}, 
                                    {-4,1,-4,1},
                                    {-1,8, 0,-2} 
                                   };

        System.out.println("最大子矩阵和="+maxMatrix(array));
    }
最大子矩阵和=15
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
最大子段和动态规划的推广可以通过以下两种方式进行: 1. 最大子段和多维数组:最大子段和问题通常是应用在一维数组,但是也可以推广到多维数组。例如,我们可以将二维数组看作一个矩阵,然后将最大子段和问题扩展为寻找矩阵最大矩阵和。 对于多维数组,我们可以使用类似的动态规划思想解决问题。定义一个辅助数组dp,其dp[i][j]表示以元素[i][j]为右下角的矩阵最大和。然后,我们可以通过以下递推关系计算dp[i][j]: dp[i][j] = max(dp[i-1][j] + dp[i][j-1] - dp[i-1][j-1], 0) + matrix[i][j] 其,matrix[i][j]表示原始矩阵的元素值。最后,我们只需要遍历dp数组,找到其最大值即可得到最大矩阵和。 2. 最大子段和和其他问题的结合:最大子段和问题可以与其他问题结合,形成更复杂的动态规划解法。例如,可以将最大子段和问题与最长递增序列问题结合,求解在一个序列既要满足递增条件,又要求和最大序列。 这种结合的方法需要根据具体问题进行调整,但基本思路是类似的:使用动态规划来构建辅助数组,然后通过递推关系计算最优解。最终,可以通过遍历辅助数组或者记录状态转移路径的方式,得到最优解。 总之,最大子段和问题的动态规划可以通过推广到多维数组及与其他问题结合的方式来应用于更广泛的场景。具体的解法需要根据具体情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值