Chinaunix首页 | 论坛 | 博客
  • 博客访问: 519965
  • 博文数量: 96
  • 博客积分: 2102
  • 博客等级: 上尉
  • 技术积分: 1695
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-11 22:12
文章分类

全部博文(96)

文章存档

2014年(2)

2012年(94)

分类: C/C++

2012-04-21 11:46:24

题目:给定由n个整数(可能为负数)组成的序列a1、a2、.......an。求该序列形如(ai+....+ak)其中i等于i、i+1、......连续的正整数。当所有整数均为负数时,设定其最大正整数和为0.因此对应最优值为:
                                         max{0, max (ai+....+ak)}
1>最简单的解法:
思路:将所有的和情况进行比较,获取最后结果。
时间复杂度:O(n^2)
  1. int max_in_he1(int a[],int l, int r)
  2. {
  3.     int i ,j,k;
  4.     int sum=0,all=0;
  5.     for(i=l;i<r;i++){
  6.          sum =0;
  7.         for(j=i;j<r;j++){
  8.             sum+=a[j];
  9.         if(all<sum)
  10.             all=sum;
  11.         }
  12.     }
  13.     printf("res1 = %d \n",all);
  14.     return all;
  15. }
2>最大子段和问题的动态规划
思路:利用一个新的容量来确定情况选择,一个变量用来存取最大字段和。
思路如果b>0时,则将a[i]加上,否则 b=a[i];
           b = max {b , b+ a[i]}
代码:
  1. int max_in_he2(int a[], int l, int r)
  2. {
  3. int i=0;
  4. int sum =0,all=0;

  5. for(i=l;i
  6. {
  7. if(sum>0)
  8. sum+=a[i];
  9. else
  10. sum=a[i];
  11. if(sum>all)
  12. all=sum;
  13. }
  14. printf("res2 = %d \n",all);
  15. return all;
  16. }
阅读(1135) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~