最大范围和代码Eval挑战



我正在尝试解决最大范围和,这是一个代码eval的挑战,它是这样的:

Bob正在制定一个在股票市场上发财的新策略。他希望将他的投资组合投资1天或更多天,然后在适当的时候卖出,以使他的收益最大化。鲍勃煞费苦心地跟踪了他的投资组合在过去N天里每天会赚多少钱或赔多少钱。现在他雇你来计算他的投资组合可能实现的最大总收益是多少。 例如:

Bob记录了最近10天的股票市场行情。每天的收益/损失如下:

7 -3 -10 4 2 -2 4 -5 -2

如果Bob在第4天进入股票市场,并在第8天退出(总共5天),他的收益将是

16 (4 + 2 + 8 + -2 + 4)

我的输入文件包含:

5;7 -3 -10 4 2 8 -2 4 -5 -2
6;-4 3 -10 5 3 -7 -3 7 -6 3
3;-7 0 -45 34 -24 7

不知何故,这三行的输出都是0。我试着调试,但没有得到这个问题。下面是我的代码:

    package MaxRangeSum;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import static java.lang.Math.floor;
import java.util.StringTokenizer;
/**
 *
 * @author kanua_000
 */
public class MaxRangeSum {
    
    public static int ret_cross = 0,ret_sum = 0;
    public static Integer leftsum = Integer.MIN_VALUE;
    public static Integer rightsum = Integer.MIN_VALUE;
    public static int sum_cross = 0, maxleft = 0,sum_max = 0;
    public static int leftsum_subarray = 0;
    public static int rightsum_subarray = 0;
    public static int crosssum = 0;
   
    public static int max_crossing_subarray(int[] A, int low, int mid, int high) {
         
     
        int i = mid;
        while (i != low) {
            sum_cross = sum_cross + A[i];
            if (sum_cross > leftsum) {
                leftsum = sum_cross;
              //  maxleft = i;
            }
            --i;
        }
        
       // int maxright = 0;
        sum_cross = 0;
        int j = mid + 1;
        while (j != high) {
            sum_cross = sum_cross + A[j];
            if (sum_cross > rightsum) {
                rightsum = sum_cross;
             //   maxright = j;
            }
            ++j;
        }
        ret_cross = leftsum + rightsum;
        return (ret_cross);
    }
    public static int max_subarray(int[] a, int low, int high) {
        
        int i = 0,j = 0;
        int[] A = new int[50];
        if (low == high) {
            return (A[low]);
        } else {
            
            int mid = (int) (floor((low + high) / 2));
            
            while (i != mid) {
                ret_sum = ret_sum + A[i];
                if (ret_sum > leftsum_subarray) {
                    leftsum_subarray = ret_sum;
                }
                i++;
            }
            leftsum_subarray = max_subarray(A, low, mid);
            j = mid+1;
            
             while (j != high) {
                ret_sum = ret_sum + A[j];  
                if (ret_sum > rightsum_subarray) {
                    rightsum_subarray = ret_sum;
                  //  maxleft = i;
                }
                j++;
            }
            rightsum_subarray = max_subarray(A, (mid + 1), high);
            
            
            crosssum = max_crossing_subarray(A, low, mid, high);
            if ((leftsum_subarray >= rightsum_subarray) & (leftsum_subarray >= crosssum)) {
                return (leftsum_subarray);
            } else if ((rightsum_subarray >= leftsum_subarray) & (rightsum_subarray >= crosssum)) {
                return (rightsum_subarray);
            } else {
                return (crosssum);
            }
        }
    }
    public static void main(String args[]) throws FileNotFoundException, IOException {
        int n = 0, i = 0;
        int line1[] = new int[50];
        int line2[] = new int[10];
        int line3[] = new int[10];
        int line4[] = new int[6];
        try (BufferedReader in = new BufferedReader(new FileReader("E:\FresnoState\CSCI 174\MaxRangeSum.txt"))) {
            String line;
            while ((line = in.readLine()) != null) {
                StringTokenizer tokenizer = new StringTokenizer(line, " ");
                while (tokenizer.hasMoreTokens()) {
                    String digits = tokenizer.nextToken();
                    if (digits.contains(";")) {
                        digits = (digits.substring(2));
                    }
                    line1[i] = Integer.parseInt(digits);
                    i++;
                }
            }
        }
        int numOfChunks = 10;
        for (int k = 0; k < numOfChunks; k++) {
            line2[k] = line1[k];
        }
        for (int r = 0; r < line2.length; ++r) {
            System.out.print(line2[r] + " ");
        }
        System.out.println();
        numOfChunks = 9;
        int j = 10;
        for (int l = 0; l <= numOfChunks; ++l, ++j) {
            line3[l] = line1[j];
        }
        for (int r = 0; r < line3.length; ++r) {
            System.out.print(line3[r] + " ");
        }
        System.out.println();
        numOfChunks = 6;
        j = 20;
        for (int m = 0; m < numOfChunks; ++m, ++j) {
            line4[m] = line1[j];
        }
        for (int r = 0; r < line4.length; ++r) {
            System.out.print(line4[r] + " ");
        }
        System.out.println();
        int line1_maxsum = max_subarray(line2, 1, 10);
        int line2_maxsum = max_subarray(line3, 11, 20);
        int line3_maxsum = max_subarray(line4, 21, 26);
        System.out.println(line1_maxsum);
        System.out.println(line2_maxsum);
        System.out.println(line3_maxsum);
    }
}

我不确定max_subarray方法在做什么,因为它是如此混乱,但是如果你想把行中的数字加起来,试着在max_subarray方法中使用这个,你可以在它周围工作,我猜。

public static int max_subarray(int[] a, int low, int high) {
    int theMiddle = (int) Math.floor(a.length / 2);
    int leftSum = addArray(a, 0, theMiddle);
    int rightSum = addArray(a, theMiddle, a.length);
    if(leftSum > rightSum){
        return leftSum;
    }else{
        return rightSum;
    }
}
public static int addArray(int[] a, int start, int end) {
    int sum = 0;
    for (int i = start; i < end; i++) {
        sum = sum + a[i];
    }
    return sum;
}

最新更新