(C语言)最大子列和问题

这是对于mooc上数据结构(浙江大学)在pat上课后习题回顾。我会把写题过程记录下来,目的是记录总结学习过程,并方便回顾。那么让我们开始吧,第一题

 

 解题思路:

刚拿到这题,实话实说,脑子里没啥想法。搜索了一下,知道了这题可以用遍历的方法解决。

思想是,对于一个定序列,定义临时子列和temptotal和最大子列和maxtotal。将临时子列和最大子列和初始化为0。遍历给定序列,将元素值的和赋给临时子列和,将临时子列和与最大子列和比较。若临时子列和大于最大子列和,则将临时子列和的值赋给最大子列和;若临时子列和<0,则将临时子列和清零。(为啥第二种情况是临时子列和<0,而不是临时子列和小于最大子列和?)

                                                       temptotal= \sum_{i=0}^{n-1}{a_{i}}  

^{a_{i}}是序列元素,n是序列元素的总个数。从0到n-1是根据数组的下标来规定的,数组的第一个数据下标为0。通过上式,就可以遍历序列的所有子列和,从而找到最大子列和。下列代码以用VS2019检验正确性。

#include <stdio.h>
#define N 1000
int main()
{
    long n;//定义要检测的元素数目
    scanf("%ld", &n); //输入元素个数
    int i;
    //初始化数据
    int a[N] = { 0 };//在内存中开辟出足够多的数组空间
    long maxtotal = 0;//最大子列和
    long temptotal = 0;//临时子列和
    //输入数组
    for (i = 0; i <= n-1; i++)//注意数组的表达!!!
        scanf("%d", &a[i]);     
    //开始遍历
    for (i = 0; i <= n-1; i++)
    {
        temptotal += a[i];
        if (temptotal > maxtotal)
            maxtotal = temptotal;
        else if (temptotal < 0)
            temptotal = 0;
    }
    printf("%ld", maxtotal);
    return 0;
}

总结:

写代码时会大脑空白,明明已经想明白要如何解题步骤,但是不知道如何表达,在编程这一块要勤加练习;通过这道题目,也复习了一些C语言的知识点,特别是关于数组下标的选取要尤为注意;

整个代码的精妙之处:临时子列和非负刷新为零,临时子列和遍历所有连续序列;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值