子数组之和的最大值

 
《编程之美》里面对求一维,二维的都进行了讲解。
1、一维中用动态规划可以使时间复杂度降到O(n).
   思想:考虑数组中A[0],与最大的一段数组(A[i],...A[j])的关系
         (1)、当0=i=j时,元素A[0]本身构成最大的一段
         (2)、当0=i<j时,和最大的一段以 A[0]开始
         (3)、当0<i时,元素A[0]与和最大一段没有关系
   假设已经知道(A[1],...A[n-1])中和最大的一段数组之和为All[1],并且已经知道(A[1],...,A[n-1])中包含A[1]的和最大一段为start[1],那么A[0]到A[n-1]中和最大的一段为max(A[0],A[0]+start[1],All[1])
  
   动态规划总是这样,分析最后的结果,然后累加中间步骤的小结果们。
C代码 复制代码  收藏代码
  1. int max(int x,int y){   
  2.     return (x > y) ? x : y;   
  3. }   
  4. int maxSum(int* A, int n){   
  5.     start[n-1] = A[n-1];   
  6.     All[n-1] = A[n-1];   
  7.     for(i = n-2; i>=0; i--){   
  8.         start[i] = max(A[i], A[i]+start[i+1]);   
  9.         all[i] = max(start[i],all[i+1]);   
  10.     }   
  11. }   return all[0];  


2、二维中,假设已经确定了矩形区域的上下边界,比如知道矩形区域的上下边界分别是第a行和第c行,现在要确定左右边界。

转化为一个一维问题,可以把每一列中第a行和第c行之间的元素看成一个整体。即求数组(BC[1],...BC[M])中和最大的一段,其中B[i] = B[a][i]+...B[c][i].

3、扩展问题;如果是三维数组呢?
我的问题是如果是高维数组呢?

----------------------------
其实不管多高维,都可以用二维数组的解法来解,三维数组就分解为两个二维平面。。对应于二维中的第a行和第c行,三维中就是第a个平面和第c平面;对应于二维中BC的数组,三维中就是BC平面。。
同样,四维就分为两个三维来做。。。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值