求最大子序列和的四种方法

本文介绍了求解给定序列中最大子序列和的四种方法,包括三层for循环穷举法、两层for穷举法、一层for循环穷举法和递归法。内容详细阐述了每种方法的思路,并提供了相应的C++实现。同时,文章还包含了测试部分,用于验证算法的正确性。

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

求一个给定序列的连续子序列中和最大的那个子序列的和,下边方法只求和,没有找出最大子序列。

用到的头文件和宏定义如下
#include "stdafx.h"
#include<vector>
#include <string>
#include <fstream>
#include <random>
#include <time.h>
#include <iostream>
typedef long int l_int;
三层for循环穷举法
该方法设计三层for训话,第一层设定求和序列的开始位置,第二层设定求和位置的结束位置,第三层对子序列进行求和。例如该序列为a1 a2 a3 a4 a5 a6,那么先a1为开始位置,分别以a2、a3、a4、a5、a6为结束位置,对五个子序列分别求和,找出其最大和sum。接着以a2为起始位置,a3、a4、a5、a6为结束位置,分别求出四个子序列的和,并且和sum比较,找出最大和。以此类推。
l_int MaxSubSum2(std::vector<int> data){
    time_t t1,t2;
    time(&t1);
    l_int sum = 0;
    for (int i=0;i<data.size();i++)
    {
        for (int j=i;j<data.size();j++)
        {
            l_int temp = 0;
            for (int k=i;k<j;k++)
            {
                temp += data[k];
            }
            if (temp > sum)
            {
                sum = temp;
            }
        }
    }
    time(&t2);
    std::cout<<"MaxSubSum2: "<<sum<<" time:"<<t2-t1<<std::endl;
    return sum;
}
两层for穷举法
观察三层for穷举法,会发现在计算起始点相同的各个子序列和时,长序列包括了各个短序列的和。例如计算a1+a2+a
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值