思路不难,就是暴力,
两层暴力。不过要剪枝,
考虑那次循环是无用的,则跳过那样的耗时、
假如1~m目前求得的最大值是M。
那么如果a[1]>0的话,就没有必要让i=2再来一次循环了,因为a[1]>0,所以2~m最大值会比M少a[1].,所以把这样的无用功剪去就好了
代码如下:
#include <cstdio>
#define M 20010
int n, a[M];
int main ()
{
int cas, t = 0, n, sum, maxi, maxj, max, m;
scanf("%d",&cas);
while(t++<cas)
{
scanf("%d",&n);
for(int i = 1; i < n; i++) scanf("%d",&a[i]);
a[0] = -1; sum = -1; maxi = maxj = max = m = 0;
for(int i = 1; i < n; i++)
{
m+=a[i-1];//剪枝条件判断
if(m>=0) continue;
sum = 0;
for(int j = i; j < n; j++)
{
sum+=a[j];//printf("%d %d = %d\n",i,j,sum);
if(sum>max) {max = sum; maxi = i; maxj = j;}
if(sum==max&&maxj-maxi<j-i) {max = sum; maxi = i; maxj = j;}
}
m = 0;
}
if(max<=0) printf("Route %d has no nice parts\n",t);
else printf("The nicest part of route %d is between stops %d and %d\n",t,maxi, maxj+1);
}
return 0;
}
本文介绍了一种基于暴力搜索的算法实现,并通过剪枝优化减少不必要的计算,提高效率。主要针对特定序列求最大子序列和的问题,通过双层循环遍历并结合剪枝条件避免无效计算。

197

被折叠的 条评论
为什么被折叠?



