zoukankan      html  css  js  c++  java
  • maxSequence

    1.最大子序问题:在其使用动态规范和分而治之的策越:

    package maxsequence;
    //模拟最大和子序列的;动态规划和分而治之思想
    public class MaxSubSum {
        public static int begin=0,end=0;
    
         static void  MaxSubSum4(int a[])
        {
            //动态规划:负的子序列不能作为最大子序列的前缀码:
             int maxSum=0,thissum=0;
             //thisSum 计算每一次加入时候结果值,保证其中范围
             int j,begintemp=0;
             int negativecount=0;
             for(j=0;j<a.length;j++)
             {
                 thissum+=a[j];
                 if(a[j]<0)
                     negativecount+=1;
                 if(maxSum<thissum)
                 {
                     maxSum=thissum;
                     end=j;//记录最后停止位置
                     begin=begintemp;
                 }
                 else if(thissum<0)
                 {
                     
                     thissum=0;
                     begintemp=j+1;//为每一次寻找最大值留出口;
                 }
             }
            if(negativecount<a.length)
            {
                System.out.println("最大子序列之和:"+maxSum+"["+begin+','+end+"]");
                System.out.println("test "+begintemp);
            }
            else
            {
                System.out.println("输入值全部是负数最大子序列规定是0");
            }
            
            
            
        }
         private static int max3(int a,int b,int c)
         {
             int d=a>b?a:b;
             int e=d>c?d:c;
             int g=((a>b)?a:b)>c?((a>b)?a:b):c;
             return e;
         }
         private static int maxSumRec(int [] a,int left,int right)
         {
             //采用递归,寻找递归的截止条件
             if(left==right)
             {
                 if(a[left]>0)
                     return a[left];
                 else
                     return 0;
                 
             }
             int center=(left+right)/2;
             int MaxLeftSum=maxSumRec(a,left,center);
             int MaxRightSum=maxSumRec(a,center+1,right);
             
             //规划一样,在左子序列中找到最大左子序列,为了计算出中间部分最大子序列
             int maxLeftBorderSum=0,LeftBroderSum=0;
             for(int i=center;i>=left;i--)
             {
                 LeftBroderSum+=a[i];
                 if(LeftBroderSum>maxLeftBorderSum)
                 {
                     maxLeftBorderSum=LeftBroderSum;
                     begin=i;
                 }
             }
             
             int maxReftBorderSum=0,ReftBroderSum=0;
             for(int i=center+1;i<=right;i++)
             {
                 ReftBroderSum+=a[i];
                 if(ReftBroderSum>maxReftBorderSum)
                 {
                     maxReftBorderSum=ReftBroderSum;
                     end=i;
                 }
             }
             //
             return max3(MaxLeftSum,MaxRightSum,maxLeftBorderSum+maxReftBorderSum);
         }
        public static void MaxSubSum3(int []a)
        {
            System.out.println(maxSumRec(a,0,a.length-1));
            System.out.println("["+begin+","+end+"]");
        }
        public static void main(String[] args) {
            // TODO Auto-generated method stub
            int Data[]={-2,11,-20,13,-5,-1,35};
            MaxSubSum4(Data);
            MaxSubSum3(Data);//通过递归,中间部分序列最大和=左序列最大和+右序列最大和
    
        }
        
    
    }
    最大子序列之和:42[3,6]
    test 3
    42
    [3,6]
  • 相关阅读:
    HDU 1069 Monkey and Banana
    HDU 1029 Ignatius and the Princess IV
    HDU 1024 Max Sum Plus Plus
    Gym100923H Por Costel and the Match
    Codeforces 682C Alyona and the Tree
    Codeforces 449B Jzzhu and Cities
    Codeforces (ccpc-wannafly camp day2) L. Por Costel and the Semipalindromes
    Codeforces 598D (ccpc-wannafly camp day1) Igor In the Museum
    Codeforces 1167c(ccpc wannafly camp day1) News Distribution 并查集模板
    快乐数问题
  • 原文地址:https://www.cnblogs.com/woainifanfan/p/6102840.html
Copyright © 2011-2022 走看看