抄过来的学习下:

import java.util.Scanner;
/*
O(N^3)这中方法就是采用暴力法咯,把所有情况都列出来!假设我们要求i--j这段下标的序列和,i从1-n,j也从1-n,有因为求i--j求和要便利一遍,最好情况是只遍历一遍
最坏是遍历n次,折中也就是n/2,所以是O(n^3);
但是我们知道,i肯定要小于j的咯,所以我们就把j从i--n循环就可以了!这可以小小优化一下,
第三种方法就是动态规划了
f(x+1)=f(x)>=0?f(x)+a[i]:a[i];用我代码中变量表示就是sum=sum+data>=0?sum+data;data;这怎么理解呢?其实不难理解,就是如果当你的和小于0事舍去,如果sum是个负数
是个拖累data,那么我为什么还要带上sum呢?data独立不是更好的嘛!所以这就建立了方程式,OK我提交!OJ对你说"wrong answer",well well全场必须hold住,怎么回事呢?
自己写了几组测试数据,我们存在一个极端情况就是,要是所有的数据都是负数呢?那我们不是把所有数据都给丢掉了,所以必须注意这一组测试数据,如果所有的数据都是负
数,那么tempEnd就是只会静茹一次,是0,那么最后start会比end大, if(start>end)  end=start;这样就OK了,题目说了最小数值是-1000,所以我们max出事定义是位-1001
*/  
  
class Main  
{  
    public static void main(String args[])  
    {  
        Scanner keyIn = new Scanner(System.in);  
        while(keyIn.hasNext())  
        {  
        int iCase = keyIn.nextInt();  
        for(int i =1;i<=iCase;i++)  
        {  
            int n = keyIn.nextInt();  
            int sum =0;  
            int data;  
            int start=0;  
            int end=0;  
            int tempStart =0;  
            int tempEnd = 0;  
            int max = -1001;  
            for(int j=0;j<n;j++)  
            {  
                data = keyIn.nextInt();  
                if(sum>=0)  
                {  
                    sum+=data;  
                    tempEnd=j;  
                }  
                else  
                {  
                    sum=data;  
                    tempStart=j;  
                }  
                  
                if(max<sum)  
                {  
                    max = sum;  
                    start = tempStart;  
                    end = tempEnd;      
                }  
            }  
            System.out.println("Case "+i+":");  
            if(start>end)  
                end=start;  
            System.out.println(max+" "+(start+1)+" "+(end+1));  
            if(i!=iCase)  
          System.out.println();  
        }  
   }  
    }  
}