洛谷 P1115最大子段和 C语言

本文探讨了动态规划与贪心算法在解决最大子段和问题中的应用,提供了两种算法的具体实现代码,详细解释了每一步的逻辑和原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

附上代码

#include<stdio.h>
long int a[200002];
long int dp[200002];//动归数组
int max(int x,int y){
	return (x > y) ? x : y;
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i = 1;i <= n;i++)
		scanf("%ld",&a[i]);
	long int maxi = a[1];//将最大值存为数组的第一个元素
	if(n == 1)
	{
		printf("%d",max);
		return 0;
	}
	dp[1] = a[1];//当只有第一个元素进行比较时,最大值为的一个元素本身
	for(int i = 2;i <= n;i++)
	{
		
		dp[i] = max(dp[i - 1] + a[i],a[i]);
		maxi = max(maxi,dp[i]);
	}
	printf("%ld",maxi);
	return 0;
 } 

删除线格式
这道题是一道动态规划题目,也可以使用贪心算法来做,dp[i]的意思是到原数组的第i个元素时,最大子段和的值,再计算dp[i]时,需要比较dp[i-1] 和a[i]的大小,如果前者较大,就说明加上a[i]后最大子段和变大了,是我们想要的,如果加上a[i]后反而变小了,那前i个数的最大子段和就是a[i]本身。
maxi用来储存dp数组中最大的数,就是最后的答案。

上面说了这道题还可以用贪心算法解,
附上代码

#include<stdio.h>
long int a[200002];
long int sum;
int max(int x,int y){
	return (x > y) ? x : y;
}
int main()
{
	int n;
	scanf("%d",&n);
	for(int i = 1;i <= n;i++)
		scanf("%ld",&a[i]);
	long int maxi = a[1];//当i为1时,最大值,前i个的最大子段和都是a[1]
	sum = a[1];
	if(n == 1)
	{
		printf("%d",max);
		return 0;
	}
	for(int i = 2;i <= n;i++)
	{
		sum += a[i];
		if(maxi < sum)//判断是否更新maxi
			maxi = sum;
		else if(sum < 0)//如果sum的值小于零,那就把前面的全部不要,从零开始
			sum = 0;
	}
	printf("%d",maxi);
	return 0;
 } 

删除线格式
简单说一下,maxi永远保存的都是数列前i项的最大子段和的值,不一定是从头开始的,而是从前i项的任意位置开始,再任意位置结束,只是最大值。
这两段代码都是可以AC的。
删除线格式
溜了溜了~~

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值