zoukankan      html  css  js  c++  java
  • 记分治法求最大子序列正确性的一次不完全证明

    依旧现贴出程序代码再进行分析:

       1:  #include <stdio.h>
       2:  #include <stdlib.h>
       3:   
       4:  int sc=0;
       5:  int max3(int a,int b, int c)
       6:  {
       7:      sc++;
       8:      if(a>b)
       9:      {
      10:          return a>c?a:c;
      11:      }
      12:      else
      13:      {
      14:          return b>c?b:c;
      15:      }
      16:  }
      17:   
      18:  int max_sub_sum(const int v[], int left, int right)
      19:  {
      20:      int center;
      21:      int maxLeftHalfSum;
      22:      int maxRightHalfSum;
      23:      int leftHalfWithRightBorderSum;
      24:      int rightHalfWithLeftBorderSum;
      25:      int maxLeftHalfWithRightBorderSum;
      26:      int maxRightHalfWithLeftBorderSum;
      27:      int i;
      28:   
      29:      if(left==right)
      30:      {
      31:          return v[left]>0?v[left]:0;
      32:      }
      33:      center=(left+right)/2;
      34:   
      35:      maxLeftHalfWithRightBorderSum=leftHalfWithRightBorderSum=
      36:      maxRightHalfWithLeftBorderSum=rightHalfWithLeftBorderSum=0;
      37:      for(i=center;i>=left;i--)
      38:      {
      39:          leftHalfWithRightBorderSum+=v[i];
      40:          if(leftHalfWithRightBorderSum>maxLeftHalfWithRightBorderSum)
      41:          {
      42:              maxLeftHalfWithRightBorderSum=leftHalfWithRightBorderSum;
      43:          }
      44:      }
      45:   
      46:      for(i=center+1;i<=right;i++)
      47:      {
      48:          rightHalfWithLeftBorderSum+=v[i];
      49:          if(rightHalfWithLeftBorderSum>maxRightHalfWithLeftBorderSum)
      50:          {
      51:              maxRightHalfWithLeftBorderSum=rightHalfWithLeftBorderSum;
      52:          }
      53:      }
      54:   
      55:      return max3(max_sub_sum(v,left,center),max_sub_sum(v,center+1,right),
      56:                  maxLeftHalfWithRightBorderSum+maxRightHalfWithLeftBorderSum);
      57:  }
      58:   
      59:  int main()
      60:  {
      61:      int v[]={1,-1,2,-2,1,-1,2,-2,1,-1,2,-2,1,-1,2,-2,1,-1,2,-2,1,-1,2,-2,1,-1,2,-2,1,-1,2,-2};
      62:      int r=max_sub_sum(v,0,31);
      63:      printf("the max sub sum is %d in step %d",r,sc);
      64:      return 0;
      65:  }

    如下为证明分治法求解该问题的有效性,随手写来,好久没做证明题了,如有错误,还望不令赐教失望失望失望失望

    image

    image

    image

  • 相关阅读:
    ABP框架使用(版本3.3.1)
    [转载] 基于.NetCore和ABP框架如何让Windows服务执行Quartz定时作业
    ABP框架使用(版本3.3.1)
    【转载】abp 调试
    如何利用Azure DevOps快速实现自动化构建、测试、打包及部署
    MongoDB语法
    python 笔记第一课
    8.4 圆柱类设计-类组合
    8.3 人事管理类的设计与实现-类组合
    8.2 方孔钱币类设计-类组合
  • 原文地址:https://www.cnblogs.com/dancewithautomation/p/2552566.html
Copyright © 2011-2022 走看看