这是对于mooc上数据结构(浙江大学)在pat上课后习题回顾。我会把写题过程记录下来,目的是记录总结学习过程,并方便回顾。那么让我们开始吧,第一题
解题思路:
刚拿到这题,实话实说,脑子里没啥想法。搜索了一下,知道了这题可以用遍历的方法解决。
思想是,对于一个定序列,定义临时子列和temptotal和最大子列和maxtotal。将临时子列和,最大子列和初始化为0。遍历给定序列,将元素值的和赋给临时子列和,将临时子列和与最大子列和比较。若临时子列和大于最大子列和,则将临时子列和的值赋给最大子列和;若临时子列和<0,则将临时子列和清零。(为啥第二种情况是临时子列和<0,而不是临时子列和小于最大子列和?)
是序列元素,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语言的知识点,特别是关于数组下标的选取要尤为注意;
整个代码的精妙之处:临时子列和非负刷新为零,临时子列和遍历所有连续序列;