子序列进阶问题
题目:
有一个数组,让找到两个不重复的连续子序列A,B ,求Max(Sum(A)-Sum(B)
分析:
- AB必定连续,设两端连接处index为{X,x+1},X可取0~n-1
- 设F(x)为连接处index为{X,x+1}时 Max(Sum(A)-Sum(B)的最大值
- 设 left_max(x): 以x为以x处结尾的序列的最大值 类比设出:left_min(x) right_max(x) right_min(x)
- 则F(x) = | left_max(x)-right_min(x) | 和 | right_max(x)-left_min(x) |中的最大值
- 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 }