前言:理解好动态规划,这道题就没啥问题了
对于任意一点(除第一个点)的最大的决策:
r[i] = max(这个点的值加上上个点的最大决策值,这个点的值)
挺好理解,这是一个连续的序列,如果你现在这个点的值加上上个点的最优使你变小了,那说明还不如不要前面那段,重新开始
像题目给出的输入输出:
input=[-10, 1, 2, 3, 4, -5, -23, 3, 7, -21]
我们经过动态规划之后得到每一个点的最佳决策值为:
r=[-10, 1, 3, 6, 10, 5, -18, 3, 10, -11]
这个时候我们很容易看到我们要的最大值为10,然后最大值的索引值往前推,直到遇到最佳决策值为负数,代表子序列完.
def toint(li):
for i in range(len(li)):
li[i]=int(li[i])
a=input()
v=input()
v=v.split(' ')
toint(v)
key=0
for i in range(len(v)):
#print(i)
if v[i]>=0:
key=1
break
if key==1:
r=[0 for i in range(len(v))]
r[0]=v[0]
for i in range(1,len(v)):
r[i]=max(v[i],r[i-1]+v[i])
#print(r)
num=max(r)
for i in range(len(r)):
if num==r[i]:
ind=i
break
ind_max=ind
key=1
ind-=1
while True:
if ind==-1:
break
if r[ind]<0:
break
else:
key+=1
ind-=1
print('%d %d %d'%(num,v[ind+1],v[ind_max]))
else:
print('0 %d %d'%(v[0],v[len(v)-1]))