zoukankan      html  css  js  c++  java
  • 最优化子数组问题

    对于最优化的子数组问题,一名话,就是从给你的数组中寻找一个子数组,使得它的和是最优的(最大/最小)
    假如求最大子数组:
                    如果数组中元素全是正的,那么好办,整个数组的和就是了。
                    如果数组中元素全是负的,那么也好办,找最小的那个。
                    但是如果正负相间呢???
    如上图中,如何求出那个最大的子数组呢?
    显然我们可以穷举,但是好像不现实。
    于昰我们采用将原问题划分成许多子问题也就是分治策略:

    如果我们能设计这样一函数

    这个函数的作用是在数组A中,从low 到 high中求出最大子数组。
    但是对于最大子数组问题,子数组的出现,可能在以下三个情况中:

    于是我们还另外设计一种特殊情况:、

    也就是跨越中点的情况,于是我们采用将原问题不停地折半的思路将原问题划原许多子问题。
    整 体思路:


    对于跨越中点的子数组:

     

    有个地方值得注意:
        
    上述中,我们的sum是一直在加的,就是防止有这种情况-1 ,-1,-1,10,···········
    虽然前面有三个-1 ,但是后面有个10,肯定都得加上。

    1. #include<iostream>
    2. #define MIN -255;
    3. struct returnVal{
    4. int left;
    5. int right;
    6. int sum;
    7. };
    8. struct returnVal*findMaxCrossingSubarray(int left,int mid ,int right,int *arr);
    9. struct returnVal *findMaxSubarray(int left,int right ,int *arr);
    10. struct returnVal*findMaxCrossingSubarray(int left,int mid ,int right,int *arr){
    11. int leftMaxSum=MIN;
    12. int sum=0;
    13. int maxLeft=0;
    14. int i,j;
    15. for(i=mid ; i>=left; i--){
    16. sum+=arr[i];
    17. if(sum>leftMaxSum){
    18. leftMaxSum=sum;
    19. maxLeft=i;
    20. }
    21. }
    22. sum=0;
    23. int rightMaxSum=MIN;
    24. int maxRight=0;
    25. for(int j=mid+1; j<=right; j++){
    26. sum+=arr[j];
    27. if(sum>rightMaxSum){
    28. rightMaxSum=sum;
    29. maxRight=j;
    30. }
    31. }
    32. struct returnVal *val=new returnVal;
    33. val->left=maxLeft;
    34. val->right=maxRight;
    35. val->sum=rightMaxSum+leftMaxSum;
    36. return val;
    37. }
    38. inline struct returnVal* maxThree_returnVal(struct returnVal *left,struct returnVal *mid,struct returnVal *right){
    39. if(left->sum>=mid->sum&&left->sum>=right->sum){
    40. return left;
    41. }
    42. if(right->right>=left->sum&&right->sum>=mid->sum){
    43. return right;
    44. }
    45. if(mid->sum>=left->sum&&mid->sum>=right->sum){
    46. return mid;
    47. }
    48. }
    49. struct returnVal *findMaxSubarray(int left,int right ,int *arr){
    50. if(left==right){
    51. struct returnVal *val=new returnVal;
    52. val->left=left;
    53. val->right=right;
    54. val->sum=arr[left];
    55. return val;
    56. }
    57. struct returnVal *valRight;
    58. struct returnVal *valCross;
    59. struct returnVal *valLeft;
    60. int mid=(left+right)/2;
    61. valLeft=findMaxSubarray(left,mid,arr);
    62. valRight=findMaxSubarray(mid+1,right,arr);
    63. valCross=findMaxCrossingSubarray(left,mid,right,arr);
    64. return maxThree_returnVal(valLeft,valCross,valRight);
    65. }
    1. int arr[16]={13,-3,-25,20,-3,-16,-23,18,20,-7,12,-5,-22,15,-4,7};
    2. int main(){
    3. struct returnVal *val=new returnVal;
    4. val=findMaxSubarray(0,15,arr);
    5. std::cout<<val->left<<","<<val->right<<","<<val->sum<<std::endl;
    6. }
    结果:

















        





  • 相关阅读:
    deepin linux 安装 mysql
    Django根据现有数据库建立model
    轻松学习正则表达式
    ubuntu 下安装 wxpython2.8
    Robot framework + appium环境搭建
    使用 robotframework 自动化测试系列 二 -----环境搭建
    使用 robotframework 自动化测试系列 一 -----简介
    执行robot framework 的测试用例 命令行pybot使用方式
    SQLAlchemy的使用---外键ForeignKey数据库创建与连接
    SQLAlchemy的使用---增删改查
  • 原文地址:https://www.cnblogs.com/yml435/p/4655522.html
Copyright © 2011-2022 走看看