close

題目連結:  https://onlinejudge.org/external/7/787.pdf

題目大意:  找出最大連續子序列乘積

思路:  N = 100,可以暴力O(N^3),不過要注意這題數字很大,要用大整數。可以用C++刻。不過Java這時候方便就在這。

優化,O(N^2),枚舉所有的i, j。用滑動窗口的概念去想,每個窗口計算乘積並記錄最大值。

再優化,O(N). Dp。維持local最大,local最小值。當數值為負,交換local最大、local最小,因為相乘會相反。維持local的兩個值,

,0的情況,則要判斷是不是現在的數字能夠較大或較小。並記錄更新最大值。算是蠻神奇的思維。 

代碼:  

import java.util.*;
import java.math.BigInteger;

public class Main {
    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int []arr = new int[105];
        int n;
        while(input.hasNext()){
            n = 0;
            while(input.hasNextInt()){
                arr[n] = input.nextInt();
                if(arr[n] == -999999) break;
                n++;
            }
            
            BigInteger res = BigInteger.valueOf(arr[0]);
            BigInteger imax = BigInteger.valueOf(arr[0]);
            BigInteger imin = BigInteger.valueOf(arr[0]);
            for(int i = 1; i < n; ++i){
                BigInteger num = BigInteger.valueOf(arr[i]);
                if(num.compareTo(BigInteger.ZERO) == -1){
                    BigInteger tmp = imax;
                    imax = imin;
                    imin = tmp;
                }
                imax = num.max(imax.multiply(num)); // max(num, imax*num)
                imin = num.min(imin.multiply(num));
                res = res.max(imax);
            }
            System.out.println(res);
        }
    }
    
}

arrow
arrow

    尾玉 發表在 痞客邦 留言(0) 人氣()