子序列进阶问题

题目:

  有一个数组,让找到两个不重复的连续子序列A,B ,求Max(Sum(A)-Sum(B)

分析:

  1.   AB必定连续,设两端连接处index为{X,x+1},X可取0~n-1
  2.      设F(x)为连接处index为{X,x+1}时 Max(Sum(A)-Sum(B)的最大值
  3.      设 left_max(x): 以x为以x处结尾的序列的最大值 类比设出:left_min(x) right_max(x) right_min(x)
  4.      则F(x) = | left_max(x)-right_min(x) | 和  | right_max(x)-left_min(x) |中的最大值
  5.      Max(Sum(A)-Sum(B) 为F(0)~F(n-1)中的最大值

上代码:

  1 /**
  2  * 
  3  */
  4 package maxsuma_sumb;
  5 /** 
  6  * @author 作者 : chenhao
  7  * @version 创建时间:2017-6-8 上午10:50:42 
  8  * @Exception : NULL
  9  * 类说明 
 10  */
 11 /**
 12  * @author chenhao
 13  *
 14  */
 15 
 16 import java.io.BufferedReader;
 17 import java.io.File;
 18 import java.io.FileInputStream;
 19 import java.io.FileNotFoundException;
 20 import java.io.FileOutputStream;
 21 import java.io.FileReader;
 22 import java.io.IOException;
 23 import java.io.InputStream;
 24 import java.io.InterruptedIOException;
 25 import java.io.OutputStream;
 26 import java.text.SimpleDateFormat;
 27 import java.util.ArrayList;
 28 import java.util.Arrays;
 29 import java.util.Date;
 30 import java.util.List;
 31 import java.util.Map;
 32 
 33 import jxl.*;    
 34 import jxl.write.*; 
 35 import jxl.write.biff.RowsExceededException;
 36 
 37 
 38 
 39 
 40 public class Main 
 41 {
 42     public static void main(String[] argv) throws IOException, RowsExceededException, WriteException{
 43     
 44         int[] nums = {1, 2, -3, 1, 1, 2, -3, 1,-9};
 45         int res = getmax(nums);
 46         System.out.println(res);        
 47         
 48     }
 49     
 50     public static int getmax(int[] nums){
 51         
 52         int length = nums.length;
 53         int[] pmaxs = positivemax(nums);
 54         int[] pmins = positivemin(nums);
 55         int[] rmaxs = reversemax(nums);
 56         int[] rmins = reversemin(nums);
 57         int result = 0;
 58         for(int i=0;i<length-2;i++){
 59             
 60               int x = Math.abs(pmaxs[i]-rmins[i+1]);
 61               int y = Math.abs(rmaxs[i+1]-pmins[i]);
 62               result = Math.max(Math.max(result , x) , y);
 63         }
 64         
 65         return result;
 66     }
 67     
 68     public static int[] positivemax(int[]nums){
 69         
 70         
 71         int len = nums.length;
 72         int[] max = new int[len];
 73         for(int i=0; i<len; i++){            
 74             if(i>0){
 75                 if(max[i-1]>0)
 76                     max[i]=max[i-1]+nums[i];
 77                 else
 78                     max[i]=nums[i];
 79             }
 80             if(i==0){
 81                 max[i]=nums[i];
 82             }
 83         }
 84         return max;
 85         
 86     }
 87     public static int[] positivemin(int[]nums){
 88         
 89         
 90         int len = nums.length;
 91         int[] min = new int[len];
 92         for(int i=0; i<len; i++){            
 93             if(i>0){
 94                 if(min[i-1]<0)
 95                     min[i]=min[i-1]+nums[i];
 96                 else
 97                     min[i]=nums[i];
 98             }
 99             if(i==0){
100                 min[i]=nums[i];
101             }
102         }
103         return min;
104         
105     }
106     
107     public static int[] reversemax(int[]nums){
108         
109         
110         int len = nums.length;
111         int[] max = new int[len];
112         for(int i=len-1; i>=0; i--){            
113             
114             if(i<len-1){
115                 if(max[i+1]>0)
116                     max[i]=max[i+1]+nums[i];
117                 else
118                     max[i]=nums[i];
119             }
120             if(i==len-1){
121                 max[i]=nums[i];
122             }
123         }
124         return max;
125         
126     }
127     
128     public static int[] reversemin(int[]nums){
129         
130         
131         int len = nums.length;
132         int[] min = new int[len];
133         for(int i=len-1; i>=0; i--){            
134             
135             if(i<len-1){
136                 if(min[i+1]<0)
137                     min[i]=min[i+1]+nums[i];
138                 else
139                     min[i]=nums[i];
140             }
141             if(i==len-1){
142                 min[i]=nums[i];
143             }
144         }
145         return min;
146         
147     }
148 }
View Code
原文地址:https://www.cnblogs.com/udld/p/7017147.html