python编写PAT 1007 Maximum Subsequence Sum(暴力 分治法 动态规划)
python编写PAT甲级 1007 Maximum Subsequence Sum
wenzongxiao1996
2019.4.3
题目
Given a sequence of K integers { N1, N2, ..., NK}. A continuous subsequence is defined to be { Ni, Ni+1, ..., Nj} 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(暴力 分治法 动态规划)的更多相关文章
- PAT 1007 Maximum Subsequence Sum (25分)
题目 Given a sequence of K integers { N1 , N2 , ..., NK }. A continuous subsequence is define ...
- 1007 Maximum Subsequence Sum (25分) 求最大连续区间和
1007 Maximum Subsequence Sum (25分) Given a sequence of K integers { N1, N2, ..., NK }. A ...
- 1007 Maximum Subsequence Sum (25 分)
1007 Maximum Subsequence Sum (25 分) Given a sequence of K integers { N1, N2, ..., NK }. A ...
- PAT 1007 Maximum Subsequence Sum(最长子段和)
1007. Maximum Subsequence Sum (25) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Y ...
- PAT 1007 Maximum Subsequence Sum 最大连续子序列和
Given a sequence of K integers { N1, N2, …, NK }. A continuous subsequence is defined to be { Ni, Ni ...
- PAT Advanced 1007 Maximum Subsequence Sum (25 分)
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to ...
- PAT 1007 Maximum Subsequence Sum (最大连续子序列之和)
Given a sequence of K integers { N1, N2, ..., *N**K* }. A continuous subsequence is defined to be { ...
- 数据结构课后练习题(练习一)1007 Maximum Subsequence Sum (25 分)
Given a sequence of K integers { N1, N2, ..., NK }. A continuous subsequence is defined to ...
- [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]选择的是 ...
随机推荐
- poj 2079 Triangle,旋转卡壳求点集的最大三角形
给出一个点集,求顶点在点集中的最大的三角形面积. 我们知道这三角形的三个点肯定在凸包上,我们求出凸包之后不能枚举,由于题目n比較大,枚举的话要O(n^3)的数量级,所以採用旋转卡壳的做法: 首先枚举三 ...
- 具体解释C++引用——带你走进引用的世界
一.介绍引用 首先说引用是什么,大家能够记住,引用就是一个别名,比方小王有个绰号叫小狗.他的妈妈喊小狗回家吃饭.那就是在喊小王回家吃饭. 接下来我们用两行代码来声明一个引用(就拿小王和小狗来说吧 ...
- BZOJ 1927 最小费用流问题
From lydrainbowcat //By SiriusRen #include <queue> #include <cstdio> #include <cstrin ...
- Chromium Graphics: Graphics and Skia
Graphics and Skia Chrome uses Skia for nearly all graphics operations, including text rendering. GDI ...
- 洛谷 P4148 简单题 KD-Tree 模板题
Code: //洛谷 P4148 简单题 KD-Tree 模板题 #include <cstdio> #include <algorithm> #include <cst ...
- bzoj5085: 最大 暴力 二分
Code: #include<cstdio> #include<algorithm> #include<cstring> #include<iostream& ...
- Centos7(阿里云服务器)安装Anaconda的详细步骤与心得
在本地安装Anaconda的各个版本的文章已经很多,但是感觉不是很详细,因此,在此发发自己在Centos7(阿里云服务器)安装Anaconda的心得和步骤: 注:需要注意的地方会用不同颜色区别. 1. ...
- TIME定时器
一.定时器分类 STM32F1 系列中,除了互联型的产品,共有 8 个定时器,分为基本定时器,通用定时器和高级定时器.基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定 ...
- [Recompose] Make Reusable React Props Streams with Lenses
If you hard-code a stream of props to target a specific prop, it becomes impossible to reuse that st ...
- CentOS 配置防火墙操作实例(启、停、开、闭port)
CentOS 配置防火墙操作实例(启.停.开.闭port): 注:防火墙的基本操作命令: 查询防火墙状态: [root@localhost ~]# service iptables status& ...