PAT(Advance Level) 1007 Maximum Subsequence Sum 解题报告
2013-10-21 16:38
501 查看
题目链接http://pat.zju.edu.cn/contests/pat-a-practise/1007
本题是经典的最大子连续序列问题,可以使用分治法求解。
但是本题还有一种很有技巧性的算法,虽然正确性不如分治法,但是时间复杂度较小(仅为O(n))。
注意一个case:-1 0 -2,容易被忽视,正确的输出应该是0 0 0,而不是0 -1 -2。
下面是C++实现代码:
本题是经典的最大子连续序列问题,可以使用分治法求解。
但是本题还有一种很有技巧性的算法,虽然正确性不如分治法,但是时间复杂度较小(仅为O(n))。
注意一个case:-1 0 -2,容易被忽视,正确的输出应该是0 0 0,而不是0 -1 -2。
下面是C++实现代码:
#include<iostream> using namespace std; int num[10010]; struct subseq { int maxsum; int start_pos; int end_pos; subseq(int sum=-1,int s=0,int e=0):maxsum(sum),start_pos(s),end_pos(e) {} } ans; int main() { int k; cin>>k; ans.end_pos=k-1; //初始化 int thissum=0; int tag=0; //标记位,表示工作子序列的起点是否发生了变化 int temp_start; //暂存工作子序列起点 for(int i=0;i<k;i++) { cin>>num[i]; thissum+=num[i]; if(thissum>ans.maxsum) { ans.maxsum=thissum; ans.end_pos=i; if(tag==1) //表示子序列的起点发生变化了 { ans.start_pos =temp_start; tag=0; } } else if(thissum<0) { thissum=0; tag=1; temp_start=i+1; } } if(ans.maxsum==-1) //表示输入的数字全为负数 ans.maxsum=0; cout<<ans.maxsum<<" "<<num[ans.start_pos]<<" "<<num[ans.end_pos]<<endl; //system("pause"); return 0; }
相关文章推荐
- PAT 1007(甲级)Maximum Subsequence Sum
- PAT_1007: Maximum Subsequence Sum
- Maximum Subsequence Sum【PAT 1007题】---简单的动态规划
- PAT 1007 Maximum Subsequence Sum
- 【PAT】甲级1007 - Maximum Subsequence Sum (最大子序列的和)
- Pat(Advanced Level)Practice--1007(Maximum Subsequence Sum)
- 浙江大学PAT上机题解析之1007. Maximum Subsequence Sum (25)
- pat 1007 Maximum Subsequence Sum
- PAT (Advanced Level) 1007 - Maximum Subsequence Sum(DP)
- PAT (Advanced Level) Practise 1007 Maximum Subsequence Sum
- PAT 1007 Maximum Subsequence Sum
- 【DP-最大子串和】PAT1007. Maximum Subsequence Sum
- PAT1007:Maximum Subsequence Sum
- 【PAT】1007 Maximum Subsequence Sum (25) 最大连续子序列和 +记录位置
- PAT Advanced Level 1007:Maximum Subsequence Sum
- PAT-1007 Maximum Subsequence Sum (25)
- pat 1007 Maximum Subsequence Sum
- Maximum Subsequence Sum[PAT1007][PTA01-复杂度2]——动态规划
- PAT1007 Maximum Subsequence Sum (25)
- PAT (Advanced Level) Practise 1007 Maximum Subsequence Sum (25)