国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發(fā)設(shè)計 > 正文

Lintcode: Maximum Subarray III

2019-11-14 23:17:07
字體:
供稿:網(wǎng)友
Lintcode: Maximum Subarray III
Given an array of integers and a number k, find k non-overlapping subarrays which have the largest sum.The number in each subarray should be contiguous.Return the largest sum.NoteThe subarray should contain at least one numberExampleGiven [-1,4,-2,3,-2,3],k=2, return 8Tags Expand 

DP. d[i][j] means the maximum sum we can get by selecting j subarrays from the first i elements.

d[i][j] = max{d[p][j-1]+maxSubArrayindexrange(p,i-1)}, with p in the range j-1<=p<=i-1

 1 public class Solution { 2     /** 3      * @param nums: A list of integers 4      * @param k: An integer denote to find k non-overlapping subarrays 5      * @return: An integer denote the sum of max k non-overlapping subarrays 6      */ 7     public int maxSubArray(ArrayList<Integer> nums, int k) { 8         // write your code 9         if (nums.size() < k) return 0;10         int len = nums.size();11         12         int[][] dp = new int[len+1][k+1];13         14         for (int i=1; i<=len; i++) {15             for (int j=1; j<=k; j++) {16                 if (i < j) {17                     dp[i][j] = 0;18                     continue;19                 }20                 dp[i][j] = Integer.MIN_VALUE;21                 for (int p=j-1; p<=i-1; p++) {22                     int local = nums.get(p);23                     int global = local;24                     for (int t=p+1; t<=i-1; t++) {25                         local = Math.max(local+nums.get(t), nums.get(t));26                         global = Math.max(local, global);27                     }28                     if (dp[i][j] < dp[p][j-1]+global) {29                         dp[i][j] = dp[p][j-1]+global;30                     }31                 }32             }33         }34         return dp[len][k];35     }36 }

別人一個類似的方法,比我少一個loop,暫時沒懂:

 1 public class Solution { 2     /** 3      * @param nums: A list of integers 4      * @param k: An integer denote to find k non-overlapping subarrays 5      * @return: An integer denote the sum of max k non-overlapping subarrays 6      */ 7     public int maxSubArray(ArrayList<Integer> nums, int k) { 8         if (nums.size()<k) return 0; 9         int len = nums.size();10         //d[i][j]: select j subarrays from the first i elements, the max sum we can get.11         int[][] d = new int[len+1][k+1];12         for (int i=0;i<=len;i++) d[i][0] = 0;        13         14         for (int j=1;j<=k;j++)15             for (int i=j;i<=len;i++){16                 d[i][j] = Integer.MIN_VALUE;17                 //Initial value of endMax and max should be taken care very very carefully.18                 int endMax = 0;19                 int max = Integer.MIN_VALUE;                20                 for (int p=i-1;p>=j-1;p--){21                     endMax = Math.max(nums.get(p), endMax+nums.get(p));22                     max = Math.max(endMax,max);23                     if (d[i][j]<d[p][j-1]+max)24                         d[i][j] = d[p][j-1]+max;                    25                 }26             }27 28         return d[len][k];29                     30 31     }32 }


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 新化县| 合川市| 宣化县| 当雄县| 杭锦后旗| 炎陵县| 仲巴县| 德保县| 贺兰县| 高邑县| 涞源县| 微博| 苗栗县| 尼勒克县| 宜章县| 故城县| 山阴县| 百色市| 茌平县| 澳门| 资兴市| 大名县| 泗阳县| 长泰县| 鄂尔多斯市| 措勤县| 胶州市| 盐边县| 加查县| 清河县| 保定市| 贵定县| 行唐县| 屏东县| 略阳县| 兴海县| 星子县| 大名县| 肇源县| 新邵县| 中超|