子序列最大和问题!!python实现

python初学者,没有很高级的操作,和上一篇java代码相似。
????????????
Java实现子序列最大和问题
说一下小白用pycharm写python心得吧。
(说实话,pycharm确实是个好软件,但是我用eclipse写Java写多了就不太习惯。因为pycharm对拼写的检查太仔细了。
比如说用一些单词的缩写组合组成一个变量名或者方法名最好在每个缩写之间加上下划线,不加也不会报错,只是pycharm会给你加上下划线,我看着就难受,无奈只能屈服,按照规则走。pycharm这样做对于新手确实不容易上手,但是也有利于让新手养成编写漂亮代码的习惯;
当初选择pycharm是因为pycharm的debug功能实在太好用了,比eclipse的好用很多,debug能更好的让我们理解一些逻辑上很难想通的代码,所以学会用debug还是一个优秀程序员的必备吧。)
下面直接上python代码:
????????????
**

1、整体说明

**

from random import choices
from time import time

#函数的入口(自定义的)
def control():
#初始化数组函数(参数为数组长度)
def init_array(array_num):
#根据用户键入选择调用的函数(参数为用户键入的函数编号)
def exec_func(n, a):
#蛮力法
def max_sub_sequence_sum1(a):
#蛮力法改良版
def max_sub_sequence_sum2(a):
#蛮力法究极改良版
def max_sub_sequence_sum3(a):

2、函数的入口(自定义的)

def control():
    array_num = int(input("请输入序列长度:"))
    func_num = int(input("请输入要使用的函数序号:(1-蛮力法;2-蛮力法改良版;3-蛮力法究极改良版)"))
    l1 = init_array(array_num)
    start_time = time()
    l2 = exec_func(func_num, l1)
    end_time = time()
    print('最大和对应的元素为第', (l2[1] + 1), '到第', (l2[2] + 1), '    对应的元素为:', l1[l2[1]], '和', l1[l2[2]])
    print('子序列最大和为:', l2[0])
    print('所用时间:', (end_time - start_time))

3、初始化数组函数

def init_array(array_num):
    a = [num for num in choices(range(array_num), k=array_num)]
    for i in choices(range(array_num), k=array_num // 2):
        a[i] = a[i] * ((-1) ** i)
    for i in range(array_num):
        if i % 10 == 0 and i != 0:
            print('\n')
        if i == array_num-1:
            print(a[array_num-1])
        else:
            print(a[i], end=',')
    return a

4、根据用户键入选择调用的函数

def exec_func(n, a):
    if n == 1:
        return max_sub_sequence_sum1(a)
    elif n == 2:
        return max_sub_sequence_sum2(a)
    elif n == 3:
        return max_sub_sequence_sum3(a)
    else:
        print('输入错误!')

5、蛮力法

def max_sub_sequence_sum1(a):
    max_sum = 0
    for i in range(len(a)):
        for j in range(i, len(a)):
            this_sum = 0
            for k in range(i, j + 1):
                this_sum += a[k]
            if this_sum > max_sum:
                max_sum = this_sum
                flag_start = i
                flag_end = j
    return [max_sum, flag_start, flag_end]

6、蛮力法改良版

def max_sub_sequence_sum2(a):
    max_sum = 0
    for i in range(len(a)):
        this_sum = 0
        for j in range(i, len(a)):
            this_sum += a[j]
            if this_sum > max_sum:
                max_sum = this_sum
                flag_start = i
                flag_end = j
    return [max_sum, flag_start, flag_end]

7、蛮力法究极改良版

def max_sub_sequence_sum3(a):
    max_sum = 0
    this_sum = 0
    for j in range(len(a)):
        i = 0
        this_sum += a[j]
        if this_sum > max_sum:
            max_sum = this_sum
            flag_start = i
            flag_end = j
        elif this_sum < 0:
            i = j + 1
            this_sum = 0
    return [max_sum, flag_start, flag_end]

8、调用函数入口:

control()

本博客纯属本人笔记,技术含量低,欢迎大佬打扰指点。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值