博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
顺序表应用8:最大子段和之动态规划法(SDUT 3665)
阅读量:4544 次
发布时间:2019-06-08

本文共 1040 字,大约阅读时间需要 3 分钟。

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

输出所求的最大子段和

Sample Input

6

-2 11 -4 13 -5 -2

Sample Output

20

题解:因为小于0的记为0,所以遍历一遍顺序表就可以,如果当前的sum小于0,那么加上一定不是最优解,所以直接舍去,sum=0,比较sum和当前ans的大小,记录最大值为ans。

#include 
using namespace std;const int maxn = 100001;struct node{ int *elem; int len;};void Creatlist(struct node &list, int n){ list.elem=new int[maxn]; if(!list.elem) exit(OVERFLOW); list.len = n; for(int i=0; i
= ans) { ans = sum; } } return ans;}int main(){ int n; struct node list; scanf("%d",&n); Creatlist(list, n); int ans = get_ans(list); printf("%d\n", ans); return 0;}

 

 

转载于:https://www.cnblogs.com/lcchy/p/10139552.html

你可能感兴趣的文章
线程池技术
查看>>
http后台json解析实例
查看>>
iOS中延时执行方法的比较和汇总
查看>>
1284 2 3 5 7的倍数
查看>>
php 手记
查看>>
设计模式-注册树模式
查看>>
Unity基本API总览
查看>>
如何将一段文本编译成C#内存程序的过程
查看>>
PAT——1070. 结绳
查看>>
【23.33%】【codeforces 664C】International Olympiad
查看>>
java-网络编程-使用URLDecoder和URLEncoder
查看>>
最短路之dijkstra算法
查看>>
SHDP--Working With HBase (二)之HBase JDBC驱动Phoenix与SpringJDBCTemplate的集成
查看>>
Lua语法基础(一)
查看>>
.Net Core2.*学习手册
查看>>
实验一、命令解释程序的编写实验
查看>>
2018年11月14日 学习字符串用法2
查看>>
2019年5月26日 re模块2
查看>>
Mac显示器不亮
查看>>
luogu P2312 解方程
查看>>