Chinaunix首页 | 论坛 | 博客
  • 博客访问: 64520
  • 博文数量: 115
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 10
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-08 19:09
文章分类
文章存档

2015年(115)

我的朋友

分类: C/C++

2015-08-06 16:50:18

3.求子数组的最大和
题目:
输入一个整形数组,数组里有正数也有负数。
数组中连续的一个或多个整数组成一个子数组,每个子数组都有一个和。
求所有子数组的和的最大值。要求时间复杂度为O(n)。

例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2,
因此输出为该子数组的和18。

这是个简单的动态规划题。结果用一维数组表示即可。
设第n个数,包含n的和最大的连续子数组的和是f(n),
那么对于前n+1个数来说,包含第n+1个数(即n+1是子数组的最后一个元素),最大连续子数组和,要么为 n+1,要么为f(n)+n+1
即f(n+1) = max(f(n)+input[n+1], input[n+1]);


点击(此处)折叠或打开

  1. /*
  2.  * =====================================================================================
  3.  *
  4.  * Filename: maxsum.c
  5.  *
  6.  * Description:
  7.  *
  8.  * Version: 1.0
  9.  * Created: 10/02/2012 10:13:50 PM
  10.  * Revision: none
  11.  * Compiler: gcc
  12.  *
  13.  * Author: YOUR NAME (),
  14.  * Organization:
  15.  *
  16.  * =====================================================================================
  17.  */
  18. #include <stdlib.h>
  19. #include <stdio.h>

  20. int input[] = {1, -2, 3, 10, -4, 7, 2, -5};
  21. int result[sizeof(input)/sizeof(int)];
  22. int max = 0;

  23. void run(){
  24.     result[0] = input[0];
  25.     int i = 1;
  26.     for(;i<sizeof(input)/sizeof(int);i++){
  27.         result[i] = (result[i-1] + input[i]) >input[i] ? (result[i-1] + input[i]):input[i];
  28.         max = max>result[i]?max:result[i];
  29.     }
  30. }

  31. /*
  32.  * === FUNCTION ======================================================================
  33.  * Name: main
  34.  * Description:
  35.  * =====================================================================================
  36.  */
  37.     int
  38. main ( int argc, char *argv[] )
  39. {
  40.     run();
  41.     printf ( "max sum: %d\n",max );
  42.     return EXIT_SUCCESS;
  43. }                /* ---------- end of function main ---------- */



阅读(201) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~