• 子序列进阶问题


    题目:

      有一个数组,让找到两个不重复的连续子序列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
  • 相关阅读:
    java中字符串类型的比较
    iOS 检测是否插入耳机
    Model-View-Controller (The iPhone Developer's Cookbook)
    Spring Animation
    CoreImage 自动增强滤镜 以及 系统滤镜查询
    UIView Animation
    CoreImage 查询系统滤镜
    CoreImage 的人脸检测
    Smarty 模板操作
    smarty转载(1)
  • 原文地址:https://www.cnblogs.com/udld/p/7017147.html
Copyright © 2020-2023  润新知