acm_最长子序列
2016-05-07 23:29
337 查看
题目:
[align=left]Problem Description[/align]
Given a sequence a[1],a[2],a[3]......a
, your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14.<br>
[align=left]Input[/align]
The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line starts with a number N(1<=N<=100000), then N integers followed(all the integers are between -1000 and
1000).<br>
[align=left]Output[/align]
For each test case, you should output two lines. The first line is "Case #:", # means the number of the test case. The second line contains three integers, the Max Sum in the sequence, the start position of the sub-sequence, the end
position of the sub-sequence. If there are more than one result, output the first one. Output a blank line between two cases.<br>
[align=left]Sample Input[/align]
[align=left]Sample Output[/align]
题意:给你一个序列,然后求连续的一段数相加最大,求出这个最长子序列。。
想法:第一个用动态规划的题,用搜索应该也能做,但时间长,假定Max(k)表示以ak 做为“终点”的最长上升子序列的长度,那么:Max(1) = 1,Max (k) = Max { Max (i):1<i < k 且 ai < ak 且 k≠1 } + 1。。然后累加值即可。。
代码:
#include <iostream>
#include<stdio.h>
using namespace std;
int main()
{
//freopen("r.txt","r",stdin);
int i,ca=1,t,s,e,n,x,now,before,max;
cin>>t;
while(t--)
{
cin>>n;
for(i=1;i<=n;i++)
{
cin>>now;
if(i==1)
{
max=before=now;
x=s=e=1;
}
else {
if(now>now+before)
{
before=now;
x=i;
}
else before+=now;
}
if(before>max)
max=before,s=x,e=i;
}
cout<<"Case "<<ca<<":"<<endl;
cout<<max<<" "<<s<<" "<<e<<endl;
ca++;
if(t!=0)
cout<<endl;
}
return 0;
}
搜索比较容易想,代码比较长。。动态规划却相反。。
[align=left]Problem Description[/align]
Given a sequence a[1],a[2],a[3]......a
, your job is to calculate the max sum of a sub-sequence. For example, given (6,-1,5,4,-7), the max sum in this sequence is 6 + (-1) + 5 + 4 = 14.<br>
[align=left]Input[/align]
The first line of the input contains an integer T(1<=T<=20) which means the number of test cases. Then T lines follow, each line starts with a number N(1<=N<=100000), then N integers followed(all the integers are between -1000 and
1000).<br>
[align=left]Output[/align]
For each test case, you should output two lines. The first line is "Case #:", # means the number of the test case. The second line contains three integers, the Max Sum in the sequence, the start position of the sub-sequence, the end
position of the sub-sequence. If there are more than one result, output the first one. Output a blank line between two cases.<br>
[align=left]Sample Input[/align]
2 5 6 -1 5 4 -7 7 0 6 -1 1 -6 7 -5
[align=left]Sample Output[/align]
Case 1: 14 1 4 Case 2: 7 1 6
题意:给你一个序列,然后求连续的一段数相加最大,求出这个最长子序列。。
想法:第一个用动态规划的题,用搜索应该也能做,但时间长,假定Max(k)表示以ak 做为“终点”的最长上升子序列的长度,那么:Max(1) = 1,Max (k) = Max { Max (i):1<i < k 且 ai < ak 且 k≠1 } + 1。。然后累加值即可。。
代码:
#include <iostream>
#include<stdio.h>
using namespace std;
int main()
{
//freopen("r.txt","r",stdin);
int i,ca=1,t,s,e,n,x,now,before,max;
cin>>t;
while(t--)
{
cin>>n;
for(i=1;i<=n;i++)
{
cin>>now;
if(i==1)
{
max=before=now;
x=s=e=1;
}
else {
if(now>now+before)
{
before=now;
x=i;
}
else before+=now;
}
if(before>max)
max=before,s=x,e=i;
}
cout<<"Case "<<ca<<":"<<endl;
cout<<max<<" "<<s<<" "<<e<<endl;
ca++;
if(t!=0)
cout<<endl;
}
return 0;
}
搜索比较容易想,代码比较长。。动态规划却相反。。
相关文章推荐
- socket编程之select(),poll(),epoll()
- iOS开发--TableView详细解释
- 数据:人类的足迹
- IOS CoreAnimation
- Spring MVC 4 使用常规的fileupload上传文件(带源码)
- LeetCode 76. Minimum Window Substring
- 欢迎使用CSDN-markdown编辑器
- 通过hexo+github建立博客
- 通过案例对SparkStreaming透彻理解三板斧之二:解密SparkStreaming运行机制和架构进阶之运行机制和架构
- Python 测试(一)—— doctest
- g++的编译及调试
- SDM For Face Alignment 流程介绍及Matlab代码实现之训练篇
- 多线程——线程通信
- Java RMI 入门案例
- 如何解决无法有多个返回值的问题
- jQuery获取数组对象的值
- Java面试题
- 基于HttpClient的一个POST通信用法例子
- caffe简易上手指南(三)—— 使用模型进行fine tune
- HDU 1057 - A New Growth Industry