算法设计与分析 | 最大字序列和(动态规划)

题目

给定一整型数列{a1,a2...,an},找出连续子序列{ax,ax+1,...,ay},使得该子序列的和最大,其中,1<=x<=y<=n。

输入

第一行是一个整数N(N<=10)表示测试数据的组数)

每组测试数据的第一行是一个整数n表示序列中共有n个整数,随后的一行里有n个整数I(-100=<I<=100),表示数列中的所有元素。(0<n<=1000000)

输出

对于每组测试数据输出和最大的连续子串的和。

样例输入

复制代码
1
5
1 2 -1 3 -2

样例输出

复制代码
5

分析

该题求最大子序列和,因为可以输入负数,所以要考虑到结果会越加越小的情况,那么这样就并不是越长的子串就越大。所以可以使用累加的值m来判断是否要丢弃前面的字符串,如果m此刻为负数,那么丢弃前面的字串(因为负数加入只会让子序列和变小),m等于a[i]重新累加;如果m为正数则继续累加,直到求出最大子序列和。

代码

cpp 复制代码
//动态规划(最大子序列和)
# include <stdio.h>
# include <stdlib.h>
int main()
{
	int n,m,sum=0,i,z;
	int a[1000];

	scanf("%d", &z);
	while (z--)
	{
		scanf("%d", &n);
		scanf("%d", &a[0]);

		m = sum = a[0];

		for (i = 1; i < n; i++)
		{
			scanf("%d", &a[i]);

			if (m >= 0)
			{
				m += a[i];
			}
			else
			{
				m = a[i];
			}

			if (sum < m)
			{
				sum = m;
			}
		}

		printf("%d\n", sum);
	}

	return 0;
}
相关推荐
linsa_pursuer几秒前
移动零算法
java·算法
小宇的天下6 分钟前
Calibre 工具支持多种几何版图格式。
算法
苏宸啊12 分钟前
排序(一)插入 希尔 选择 堆排 冒泡
算法·排序算法
bosins12 分钟前
基于Python实现PDF文件个人隐私信息检查
开发语言·python·pdf
bosins12 分钟前
基于Python开发PDF文件元数据查看器
开发语言·python·pdf
lihao lihao12 分钟前
模板进阶
java·数据结构·算法
小北方城市网19 分钟前
第 10 课:Python 全体系实战整合与职业进阶指南(完结篇)
大数据·开发语言·数据库·python
慕容青峰20 分钟前
【加拿大计算机竞赛 CCO 小行星采矿】题解
c++·算法·sublime text
Ghost-Silver25 分钟前
2025年度总结
开发语言·数据结构·c++·算法
The star"'25 分钟前
Python
开发语言·python·pygame