1093:最大子序列
来源:互联网 发布:比较好的网络穿越小说 编辑:程序博客网 时间:2024/06/07 18:19
1093: 最大子序列
时间限制: 1 Sec 内存限制: 128 MB
提交: 0 解决: 0
[提交][状态][讨论版]
题目描述
对于给出的K个整数的序列{ N1, N2, ..., NK }.,其连续的子序列定义为 { Ni, Ni+1, ..., Nj },其中1 <= i <= j <= K. 最大子序列是其连续子序列中元素之和最大的子序列。例如:对于 { -2, 11, -4, 13, -5, -2 }, 最大子序列为 { 11, -4, 13 },最大和为20。编程找出其最大子序列。
输入
每个输入包含两行,第一行表示序列个数K,第二行为序列的K个元素,各元素间用空格分隔。
输出
最大子序列,如果存在具有相等最大和,则全部输出,每个序列一行。
样例输入
10
-10 1 2 3 4 -5 -23 3 7 -21
样例输出
1 2 3 4
然后是一位高手的版本
暑假作业算是折腾完一遍了,不过发文章记录是中途开始的,之后几天也会把之前的题目再做几遍,把部分题目整理一下……哎,实验报告还没写,开学小学期还有编程能力测试,我的心好痛TVT
时间限制: 1 Sec 内存限制: 128 MB
提交: 0 解决: 0
[提交][状态][讨论版]
题目描述
对于给出的K个整数的序列{ N1, N2, ..., NK }.,其连续的子序列定义为 { Ni, Ni+1, ..., Nj },其中1 <= i <= j <= K. 最大子序列是其连续子序列中元素之和最大的子序列。例如:对于 { -2, 11, -4, 13, -5, -2 }, 最大子序列为 { 11, -4, 13 },最大和为20。编程找出其最大子序列。
输入
每个输入包含两行,第一行表示序列个数K,第二行为序列的K个元素,各元素间用空格分隔。
输出
最大子序列,如果存在具有相等最大和,则全部输出,每个序列一行。
样例输入
10
-10 1 2 3 4 -5 -23 3 7 -21
样例输出
1 2 3 4
3 7
这个题目,一开始结果只能输出一组数据,尝试记录多组结果失败了。
在论坛发帖提问,得到两个比较好的回答,一个直接在我的程序上进行了修改,思路比较清晰,就是双重循环,
另一个程序很简洁优美,不过我还没有完全理解到能自己打出来的程度orz
总之先搬上来。
首先是易于理解的版本
#include <iostream>using namespace std;const int N = 100; typedef struct START_AND_END{ int start; int end;}startAndEnd; int main(){ int k; int a[N]; int i, j, m, n; startAndEnd sign[N]; int signSize = 0; cin >> k; for (i = 0; i < k; i++) cin >> a[i]; /*int start[10] = { 0 }, end[10] = { 0 };*/ int start = 0, end = 0; int count = 0; int sum[N]; memset(sum, 0, sizeof(sum)); sum[0] = a[0]; int max=0; for (i = 0; i < k; i++) { //初始化,最大值为a[i] sum[i] = a[i]; for (j = i + 1; j < k; j++) { sum[i] += a[j]; //从a[i]开始逐个往后加,如果子序列的和大于当前最大的和,更新最大值,同时标记end if (sum[i]>max) { max = sum[i]; sign[signSize].start = i; sign[signSize].end = j; } } } for (i = 0; i < k; i++) { //cout << i; //初始化,最大值为a[i] sum[i] = a[i]; for (j = i + 1; j < k; j++) { //cout << j; sum[i] += a[j]; //从a[i]开始逐个往后加,如果子序列的和大于当前最大的和,更新最大值,同时标记end if (sum[i] == max) { for(m = 0; m < N; m++) { if(sign[m].start != i) { signSize++; sign[signSize].start = i; sign[signSize].end = j; for (n = sign[signSize].start; n <= sign[signSize].end; n++) { cout << a[n] << " "; } cout << "\n"; break; } } } } } system("pause"); return 0;}
然后是一位高手的版本
const int N=1000;int a[N],s[N],t[N],ct,n,ans; int main(void){ while(cin>>n && n){ for(int i=0;i<n;i++) cin>>a[i]; ans =-1e9; ct =0; for(int i=0,pre=0,sum=0;i<n;i++){ if((sum +=a[i]) <=0){pre=i+1;sum=0;continue;} if(sum<ans) continue; if(sum>ans) ct =0, ans=sum; s[ct]=pre, t[ct++] =i; } for(int i=0;i<ct;i++) { cout<<a[s[i]]; for(int j=s[i]+1;j<=t[i];j++) cout<<' '<<a[j]; cout<<endl; } } return 0;}
暑假作业算是折腾完一遍了,不过发文章记录是中途开始的,之后几天也会把之前的题目再做几遍,把部分题目整理一下……哎,实验报告还没写,开学小学期还有编程能力测试,我的心好痛TVT
努力吧,被C++逼婚只能硬着头皮上啊啊啊
多思考,多编程
Errors == more coding^2~
0 0
- 1093:最大子序列
- 最大子序列
- 最大子序列问题
- 最大子序列问题
- 最大子序列
- 最大子序列
- 最大子序列
- 最大子序列
- 最大子序列问题
- 求最大子序列
- 最大子序列和
- hdu1231 最大子序列
- 最大子序列
- 最大子序列和
- 最大递归子序列
- DP最大子序列
- 最大和子序列
- 最大子序列问题
- 南邮 OJ 1589 开灯问题
- 5.执行非查询语句
- Grunt搭建前端开发环境
- 初探单点登录 SSO
- Tomcat 如何设置系统配置参数及加载
- 1093:最大子序列
- android开发中注意的安全问题
- hdu 5352 MZL's City 2015多校联合训练赛#5 费用流
- 排序算法
- error while loading shared libraries: xxx.so.x" 错误的原因和解决办法
- 南邮 OJ 1590 阶乘
- linux上svn服务器及客户端的安装配置
- 国内CVPR和图像处理领域的公司和研究机构
- C++11 标准新特性: 右值引用与转移语义