本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:
数据1:与样例等价,测试基本正确性;
输入第1行给出正整数K (≤);第2行给出K个整数,其间以空格分隔。
输出格式:
在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。
利用分治法思想。对最大子列和从暴力算法进行优化,将区间从中间一分为二,将问题划分为求左区间、右区间、横跨左右区间的最大子列和问题。其中左右区间可以通过递归完成,中间的最大子列和要另外处理。从而使时间复杂度为nlog(n);
在解决这个问题中,遇到的最大问题是如何求跨中间区域的最大子段和问题,这部分相对比较难,修改过几次,求出来的答案老是不对。另外,在提交代码后其实还发现pta上对于如果是只有一个且为负数这个点没有对应测试点。另一点,在编程时发现l和1在代码块中基本一模一样,导致很多时候很难读出是l还是1,从而导致代码可读性差,所以要尽量避免使用l。
上面两个不同方法的时间复杂度不同,采用分治法将问题一分为二,每一段进行加法比较,根据分析,求得时间复杂度为nlog(n),对于第二种算法,只需要一重循环搞定,从而时间复杂度为O(n).
分治法思想在解决大型复杂有一定规律的题型有很多益处,能够将问题化繁为减,提高了一定的时间效率。 今后在解决这类问题时可以往这个思想上靠。
