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]
  • 相关阅读:
    MongoDB自学日记2——权限
    最近项目的几个问题
    MongoDB自学日记1——基本操作
    一次JVM调优的笔记
    Memcached学习笔记
    为博客添加计数器的方法
    关于多核系统同步互斥的小研究
    Linux中同步互斥机制研究之原子操作
    你真的懂printf么?
    Lingo安装
  • 原文地址:https://www.cnblogs.com/woainifanfan/p/6102840.html
Copyright © 2011-2022 走看看