lintcode 最大子数组III
生活随笔
收集整理的這篇文章主要介紹了
lintcode 最大子数组III
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目描述
給定一個整數數組和一個整數?k,找出?k?個不重疊子數組使得它們的和最大。每個子數組的數字在數組中的位置應該是連續的。
返回最大的和。
注意事項
子數組最少包含一個數
樣例
給出數組?[-1,4,-2,3,-2,3]?以及 k =?2,返回?8
思路
dp[i][j] = max(dp[x][j-1]+maxs[x+1][i])
dp[i][j] 表示前 i 個數中 j 個子數組的最大值,
maxs[i][j] 表示 第i個數到第j個數中最大子數組的和。
代碼
public class Solution {/*** @param nums: A list of integers* @param k: An integer denote to find k non-overlapping subarrays* @return: An integer denote the sum of max k non-overlapping subarrays*/public int maxSubArray(int[] nums, int k) {// write your code hereint[][] maxs = new int[nums.length][nums.length];int[][] dp = new int[nums.length][k+1];for(int i=0; i<nums.length; ++i) {for(int j=i; j<nums.length; ++j) {maxs[i][j] = maxSum(nums, i, j);}}for(int i=0; i<dp.length; ++i) {for(int j=0; j<dp[i].length; ++j) {dp[i][j] = Integer.MIN_VALUE;}}for(int i=0; i<dp.length; ++i) {dp[i][1] = maxs[0][i];}for(int i=1; i<nums.length; ++i) {for(int j=2; j<=k; ++j) {for(int x=j-2; x<i; ++x) {dp[i][j] = Math.max(dp[i][j], dp[x][j-1] + maxs[x+1][i]);}}}return dp[nums.length-1][k];}private int maxSum(int[] nums, int i, int j) {int sum = 0, maxs = Integer.MIN_VALUE;for(int x = i; x <= j; ++x) {sum += nums[x];if (maxs < sum) {maxs = sum;}if (sum < 0) {sum = 0;}}return maxs;}}
轉載于:https://www.cnblogs.com/hujunzheng/p/7376237.html
總結
以上是生活随笔為你收集整理的lintcode 最大子数组III的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sorl6.0+jetty+mysql搭
- 下一篇: 进项发票和成本发票的区别