PythonTip--8.3

来源:互联网 发布:淘宝代付一天多少次 编辑:程序博客网 时间:2024/06/05 07:44

最大非连续子序列

题目描述: 给你一个整数list L, 如 L=[2,-3,3,50], 求L的一个非连续子序列,使其和最大,输出最大子序列的和。
这里非连续子序列的定义是,子序列中任意相邻的两个数在原序列里都不相邻。
例如,对于L=[2,-3,3,50],输出52(分析:很明显,该列表最大非连续子序列为[2,50]).

思路:
这道题用到了动态规划,具体是什么意思可以自行百度。。。贴个地址,这个讲的很不错 动态规划链接
先贴上代码然后讲讲什么意思吧
代码:

L=[2,-3,3,50]def func(L):    for i in range(2,len(L)):        L[i] += max(max(L[:i-1]),0)    return max(L)print(func(L))

代码很短,主要就是从序列的第2个开始循环,寻找当前的索引-1之前的所有数字中最大的,如果最大的值小于0则为0,将这个最大的值加上当前值,然后赋值给当前值。
具体还是找个例子吧:
使用序列 : L = [3,5,7,-10,-2,4,6]
索引从第2开始也就是第三个数字开始:7。为什么呢?因为第一个数字前面是肯定没有数的,所以不用加,第2个数字前只有一个数,减1以后也就没有了,所以只能从第三个数字开始。
7 : 之前除了5,那最大的只有3了,所以7+3=10。序列变为L=[3,5,10,-10,-2,4,6]
继续循环:第四个数字-10:前面有5和3,最大的肯定是5了,那就变为L=[3,5,10,-5,-2,4,6]
第五个数字-2,前面有3,5,10,最大的是10,序列变为L=[3,5,10,-5,8,4,6]
第六个数字4:前面有3,5,10,-5,最大的还是10,序列变为L=[3,5,10,-5,8,14,6]
第七个数字6:前面有3,5,10,-5,8,最大的是10,序列变为L=[3,5,10,-5,8,14,16]
循环结束。
最大的数是16,看上面的循环,16=6+7+3
所以最大非连续子序列就是【3,6,7】
动态规划就是将一个大的、复杂的问题化为多个小的、简单的问题,上面就是的每一个循环其实都是求一次最大非连续子序列,第一个循环求的是序列【3,5,7】的最大非连续子序列,那肯定就是3和7了,因此就把10覆盖7,到了第二个循环,【3,5,10,-10】这个序列是不可以加上10的,因为要求非连续有了-10就不可以有7,所以不可以直接加上上一轮循环中的10,只能从3,5中挑最大的。后面同理。

不知道有没有讲清楚,以后有新的想法了再修改吧。

==============分割线================

简单题系列

这个简单题就不用什么思路了,直接贴题目和代码就好了:

题目描述: 给你直角三角形的两个直角边的边长a,b,请你求出其斜边边长,结果保留小数点后三位小数。 如a=3, b =4, 则输出5.000。

a,b = 3,4import  mathdef func(a,b):    print('{:.3f}'.format(math.sqrt(a*a+b*b)))func(a,b)

题目描述: 给你一个字符串列表L,请用一行代码将列表所有元素拼接成一个字符串并输出。
如L=[‘abc’,’d’,’efg’], 则输出abcdefg。

L=['abc','d','efg']print(''.join(i for i in L))

题目描述:给你一个字符串列表L,用一行代码顺序输出L中的元素,元素之间以一个空格隔开,注意行尾不要有空格,输出单独占一行。
如L=[‘abc’,’d’,’efg’], 则输出abc d efg。

L=['abc','d','efg']print(' '.join(i for i in L))