PAT 甲级 1007 Maximum Subsequence Sum dp
地址 https://pintia.cn/problem-sets/994805342720868352/problems/994805514284679168
题目大意
给予一个整数N
下一行再给予N个整数 空格隔开
求上述数字中连续的和最大是多少 并且输出连续最大和的起点和终点的数字 空格隔开
另外如果给予的N个整数都是负数则 连续最大和定义为0 输出N个整数的起点和终点的数字 空格隔开
0 <= N <= 10000
Sample Input: 10 -10 1 2 3 4 -5 -23 3 7 -21 Sample Output: 10 1 4
解答
本题使用动态规划
我们假设和最大的连续子序列的结尾是 num[i]。 那么这个和最大的连续子序列就有两种构成可能
1 num[x],num[x+1]...num[i-1],num[i]的和 num[x],num[x+1]...num[i-1]的和+num[i] 更大 比如 序列 1,2,3, 9,是以9结尾的连续子序列 和为15
2 num[i] num[i]更大 比如 序列 -1,-2,-3, 9 和最大的连续子序列并且以9结尾就是9单个数字
情况1中 1+2+3 又可以认为是 以num[i-1]为结尾 的最大连续子序列的和 ,
如果我们定义dp[i] 是以num[i]为结尾的最大连续子序列的和 那么
上面情况1 2 可以归纳成状态方程 dp[i] = max(dp[i-1]+num[i],num[i])
这样就解决了 求和最大的连续子序列的和的问题。
连续子序列的边界L R的求得如下
因为dp[i] 表示以num[i]结尾的 和最大的连续子序列
那么右边界肯定是R =i , 左边界如果是情况1 则等于dp[i-1]的左边界 如果是情况2 那么L =i
#include <iostream> using namespace std; const int N = 10010; int n; int arr[N]; struct DP{ long long val; int l;int r; }dp[N]; int main() { cin >> n; int allneg = 1; for(int i = 1 ;i <= n ;i++){ cin >> arr[i]; if(arr[i] >= 0) allneg=0; } if(allneg == 1){ cout << 0 << " " << arr[1] << " " << arr[n] << endl; return 0; } dp[0].l = 1; for(int i = 1;i <=n;i++){ dp[i].l = dp[i-1].l; dp[i].val = max(dp[i-1].val+arr[i],(long long) arr[i]); dp[i].r = i; if(dp[i-1].val+arr[i] < arr[i]){ dp[i].l = i; } } struct DP ans = dp[1]; for(int i = 1; i <=n;i++){ if(ans.val < dp[i].val){ ans = dp[i]; } } cout << ans.val << " " << arr[ans.l] <<" " << arr[ans.r] << endl; return 0; }
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话