顺序表应用8:最大子段和之动态规划法
来源:互联网 发布:foreach遍历二维数组 编辑:程序博客网 时间:2024/05/19 15:42
顺序表应用8:最大子段和之动态规划法
Time Limit: 5MS Memory Limit: 500KB
Problem Description
给定n(1<=n<=100000)个整数(可能为负数)组成的序列a[1],a[2],a[3],…,a[n],求该序列如a[i]+a[i+1]+…+a[j]的子段和的最大值。当所给的整数均为负数时定义子段和为0,依此定义,所求的最优值为: Max{0,a[i]+a[i+1]+…+a[j]},1<=i<=j<=n。 例如,当(a[1],a[2],a[3],a[4],a[5],a[6])=(-2,11,-4,13,-5,-2)时,最大子段和为20。
注意:本题目要求用动态规划法求解,只需要输出最大子段和的值。
Input
第一行输入整数n(1<=n<=100000),表示整数序列中的数据元素个数;
第二行依次输入n个整数,对应顺序表中存放的每个数据元素值。
Output
输出所求的最大子段和
Example Input
6
-2 11 -4 13 -5 -2
Example Output
20
Think: 基础的动态规划题。求连续的最大子段和。
m = 0;
max_sum = 0;
m为当前一直从最小为0开始连续加数,当若加完数后为负,则放弃,m变回0。在m的变化过程中, 因为后面的数可能为负,使m加了之后变小(此时m仍 >0,就是说,此后m加上一个正数还会变大),每一步用一个max_sum来记录m的变化过程中的最大值,所以最后max_sum就是最大的连续子段和
纯C代码如下:
#include <stdio.h>#include <stdlib.h>#include <malloc.h>int Max = 50010;int Add_Max = 100010;typedef struct{ int *data; int length; int size;} List;void Creat(List *L);void Add(List *L, int n);int DP_Max_Sum(List *L);int main(){ List L; Creat(&L); int n; scanf("%d", &n); Add(&L, n); int m = DP_Max_Sum(&L); printf("%d\n", m); return 0;}void Creat(List *L){ L->data = (int *)malloc(Max * sizeof(int)); if(!L->data) { exit (-1); } L->size = Max; L->length = 0;}void Add(List *L, int n){ if(L->size <= n - 1) { int *Add_Space; Add_Space = (int *)realloc(L->data, (L->size + Add_Max) * sizeof(int)); if(!Add_Space) { exit (-1); } L->data = Add_Space; L->size += Add_Max; } int i; for(i = 1; i <= n; i++) { scanf("%d", &L->data[++L->length]); }}int DP_Max_Sum(List *L){ int i, m = 0, max_sum = 0; for(i = 1; i <= L->length; i++) { if(m + L->data[i] > 0) { m += L->data[i]; } else { m = 0; } if(m > max_sum) { max_sum = m; } } return max_sum;}
阅读全文
1 0
- 顺序表应用8:最大子段和之动态规划法
- 顺序表应用8:最大子段和之动态规划法
- 顺序表应用8:最大子段和之动态规划法
- 顺序表应用8:最大子段和之动态规划法
- 顺序表应用8:最大子段和之动态规划法
- 顺序表应用8:最大子段和之动态规划法
- 顺序表应用8:最大子段和之动态规划法
- 顺序表应用8:最大子段和之动态规划法
- 顺序表应用8:最大子段和之动态规划法
- 3665顺序表应用8:最大子段和之动态规划法
- 顺序表应用8:最大子段和之动态规划法
- SDUTACM 顺序表应用8:最大子段和之动态规划法
- 顺序表应用8:最大子段和之动态规划法
- 顺序表应用8:最大子段和之动态规划法
- 顺序表应用8:最大子段和之动态规划法
- 数据结构顺序表应用8:最大子段和之动态规划法
- 顺序表应用8:最大子段和之动态规划法
- 顺序表应用8:最大子段和之动态规划法
- 解决eclipse导出javadoc时的“错误: 编码GBK的不可映射字符”问题
- Linux系统学习之初
- 手机连电脑中双重木马 腾讯两管家联手查杀
- 十六进制转八进制数
- HDU Strange fuction 1597
- 顺序表应用8:最大子段和之动态规划法
- 速7代言够快才畅快vivo X6?范·迪塞尔或出席30日发布会
- 绿地金服首家入驻360你财富开放平台 重磅“梦想计划”护航
- 京东、海尔、联想之星齐聚萧山,硬件创业者的盛会!
- 伪共享(False Sharing)
- 机器学习—CART决策树算法详解
- JS基础学习
- Linux 文件目录
- 集群计算