python编写PAT甲级 1007 Maximum Subsequence Sum

wenzongxiao1996

2019.4.3

题目

Given a sequence of K integers { N​1, N2, ..., N​K}. A continuous subsequence is defined to be { N​i, N​i+1, ..., N​j} where 1≤i≤j≤K. The Maximum Subsequence is the continuous subsequence which has the largest sum of its elements. For example, given sequence { -2, 11, -4, 13, -5, -2 }, its maximum subsequence is { 11, -4, 13 } with the largest sum being 20.

Now you are supposed to find the largest sum, together with the first and the last numbers of the maximum subsequence.

Input Specification:

Each input file contains one test case. Each case occupies two lines. The first line contains a positive integer K (≤10000). The second line contains K numbers, separated by a space.

Output Specification:

For each test case, output in one line the largest sum, together with the first and the last numbers of the maximum subsequence. The numbers must be separated by one space, but there must be no extra space at the end of a line. In case that the maximum subsequence is not unique, output the one with the smallest indices i and j (as shown by the sample case). If all the K numbers are negative, then its maximum sum is defined to be 0, and you are supposed to output the first and the last numbers of the whole sequence.

Sample Input:

10

-10 1 2 3 4 -5 -23 3 7 -21

Sample Output:

10 1 4

暴力解法(超时了)

def seq_sum(s):
"""求序列的所有元素之和"""
result = 0
for i in range(len(s)):
result += s[i]
return result def main():
n = int(input())
seq = [int(i) for i in input().split()]
max = -1
pos_i = 0
pos_j = n-1
for i in range(n):
for j in range(i,n):
sum_temp = seq_sum(seq[i:j+1])
if sum_temp > max:
max = sum_temp
pos_i = i
pos_j = j
if max < 0:
print(0,seq[pos_i],seq[pos_j])
else:
print(max,seq[pos_i],seq[pos_j]) if __name__ == '__main__':
main()

分治法

def division_solution(seq,left,right):
if left == right: # 递归出口
if seq[left] >= 0:
return left,right,seq[left]
else:
return left,right,-1
center = (left+right)//2 # 地板除 # 从中间到左边的最大子串
sum_left = 0
max_sum_left = -1 # 一定要设为负数
pos_left = left # 要返回下标
for i in range(left,center+1)[::-1]: # 反向迭代
sum_left += seq[i]
if sum_left >= max_sum_left:
max_sum_left = sum_left
pos_left = i # 从中间到右边的最大子串
sum_right = 0
max_sum_right = -1 # 一定要设为负数
pos_right = right # 要返回下标
for i in range(center+1,right+1):
sum_right += seq[i]
if sum_right > max_sum_right:
max_sum_right = sum_right
pos_right = i # 递归求解左右两个子问题
i_left,j_left,max_left_sum = division_solution(seq,left,center)
i_right,j_right,max_right_sum = division_solution(seq,center+1,right) if max(max_left_sum,max_right_sum,max_sum_left+max_sum_right) < 0:
return left,right,-1
else:
if max(max_left_sum,max_right_sum,max_sum_left+max_sum_right) == max_left_sum:
return i_left,j_left,max_left_sum
elif max(max_left_sum,max_right_sum,max_sum_left+max_sum_right) == max_right_sum:
return i_right,j_right,max_right_sum
else:
return pos_left,pos_right,max_sum_left+max_sum_right def main():
n = int(input())
seq = [eval(i) for i in input().split()]
i,j,sum_max = division_solution(seq,0,n-1)
if sum_max < 0:
print(0,seq[0],seq[-1])
else:
print(sum_max,seq[i],seq[j]) if __name__ == '__main__':
main()

动态规划

def main():
n = int(input())
seq = [eval(i) for i in input().split()]
sum_max = -1
pos_i = 0
pos_i_temp = 0 # 最大子序列的左下标不能随意更改,只有找到了更大的子串才能改,用这个变量先保存着当前寻找的子串的左下标
pos_j = n-1
sum_temp = 0
for i in range(n):
sum_temp += seq[i]
if sum_temp > sum_max:
sum_max = sum_temp
pos_j = i
pos_i = pos_i_temp
elif sum_temp < 0:# 和小于0的子串不需要考虑
sum_temp = 0
pos_i_temp = i+1
if sum_max < 0:
print(0,seq[0],seq[-1])
else:
print(sum_max,seq[pos_i],seq[pos_j]) if __name__ == '__main__':
main()

谢谢观看!敬请指正!

参考博客:https://www.cnblogs.com/allzy/p/5162815.html

原题链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805514284679168

python编写PAT 1007 Maximum Subsequence Sum(暴力 分治法 动态规划)的更多相关文章

  1. PAT 1007 Maximum Subsequence Sum (25分)

    题目 Given a sequence of K integers { N​1​​ , N​2​​ , ..., N​K​​ }. A continuous subsequence is define ...

  2. 1007 Maximum Subsequence Sum (25分) 求最大连续区间和

    1007 Maximum Subsequence Sum (25分)   Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A ...

  3. 1007 Maximum Subsequence Sum (25 分)

    1007 Maximum Subsequence Sum (25 分)   Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A ...

  4. PAT 1007 Maximum Subsequence Sum(最长子段和)

    1007. Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...

  5. PAT 1007 Maximum Subsequence Sum 最大连续子序列和

    Given a sequence of K integers { N1, N2, …, NK }. A continuous subsequence is defined to be { Ni, Ni ...

  6. PAT Advanced 1007 Maximum Subsequence Sum (25 分)

    Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A continuous subsequence is defined to ...

  7. PAT 1007 Maximum Subsequence Sum (最大连续子序列之和)

    Given a sequence of K integers { N1, N2, ..., *N**K* }. A continuous subsequence is defined to be { ...

  8. 数据结构课后练习题(练习一)1007 Maximum Subsequence Sum (25 分)

    Given a sequence of K integers { N​1​​, N​2​​, ..., N​K​​ }. A continuous subsequence is defined to ...

  9. [pat]1007 Maximum Subsequence Sum

    经典最大连续子序列,dp[0]=a[0],状态转移dp[i]=max(dp[i-1]+a[i],a[i])找到最大的dp[i]. 难点在于记录起点,这里同样利用动态规划s[i],如果dp[i]选择的是 ...

随机推荐

  1. SPOJ 题目705 New Distinct Substrings(后缀数组,求不同的子串个数)

    SUBST1 - New Distinct Substrings no tags  Given a string, we need to find the total number of its di ...

  2. nyoj-673-悟空的难题(数组标记)

    悟空的难题 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描写叙述 自从悟空当上了齐天大圣.花果山上的猴子猴孙们便也能够尝到天上的各种仙果神酒,所以猴子猴孙们的体质也得到了非 ...

  3. 关键字super

    1.super,相较于关键字this,可以修饰属性.方法.构造器 2.super修饰属性.方法:在子类的方法.构造器中,通过super.属性或者super.方法的形式,显式的调用父类的指定 属性或方法 ...

  4. Linux 玩法

    php 跑不了,只来404 同一台linux服务器上建两个网站(www.A.com, www.B.com),现在A和B都跑起来了,但只有 A 能跑 php, B只能跑静态 html 文件,不知道哪里设 ...

  5. PostgreSQL Replication之第二章 理解PostgreSQL的事务日志(1)

    在前面的章节中,我们已经理解了各种复制概念.这不仅仅是一个为了接下来将要介绍的东西而增强您的意识的理论概述,还将为您介绍大体的主题. 在本章,我们将更加接近实际的解决方案,并了解PostgreSQL内 ...

  6. PostgreSQL相关总结

    源码安装PostgreSQL总结 简明安装步骤(其中prefix指定PostgreSQL的安装目录,该目录与数据目录pgdata和PostgreSQL的源代码包目录均无关) yum -y instal ...

  7. css inline-block列表布局

    一.使用inline-block布局 二.多列布局方法二 <html><head> <meta charset="utf-8"> <tit ...

  8. iOS——集成支付宝 ’openssl/asn1.h' file not found

    问题原因:文件路径找不到的问题 解决方法:在 Building Settings -> Search Paths -> Header Search Paths 里,添加一个文件路径:$(P ...

  9. 学习Go语言之简易ORM框架

    ORM即为对象关系映射,ORM常用于程序适配多种数据库,以达到开放扩展关闭修改的原则.笔者初学Golang,遂有意写个简易ORM框架,权当知识巩固. 首先需要有一个思想就是数据库表结构都是固定,但是每 ...

  10. [洛谷P1939]【模板】矩阵加速(数列)

    题目大意:给你一个数列a,规定$a[1]=a[2]=a[3]=1$,$a[i]=a[i-1]+a[i-3](i>3)$求$a[n]\ mod\ 10^9+7$的值. 解题思路:这题看似是很简单的 ...