1003 最大连续子序列
来源:互联网 发布:十香cosplay淘宝 编辑:程序博客网 时间:2024/06/15 13:28
最大连续子序列
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)
Total Submission(s) : 56 Accepted Submission(s) : 25
6-2 11 -4 13 -5 -210-10 1 2 3 4 -5 -23 3 7 -2165 -8 3 2 5 01103-1 -5 -23-1 0 -20
20 11 1310 1 410 3 510 10 100 -1 -20 0 0<div style='font-family:Times New Roman;font-size:14px;background-color:F4FBFF;border:#B7CBFF 1px dashed;padding:6px'><div style='font-family:Arial;font-weight:bold;color:#7CA9ED;border-bottom:#B7CBFF 1px dashed'><i>Hint</i></div>Hint</div>Huge input, scanf is recommended.
这题题意简单明了,就是一个最大连续字段和问题,他的前身就是简单动态规划,方法上也是一个式子解决:dp【i】=max{dp【i-1】+a【i】,0};初始状态设置为
dp【i】=max{a【i】,0}。
然而这题稍微难了一点,让同时求出来字序列的首位元素。我的思路是尾元素肯定是知道的,在最后循环找最大字段和的时候,找的的地方就是尾元素的位置。所以要求的就只是一个首元素,而首元素遵循这么一个原则:如果满足dp[【i1】+p【i】>0,那么字段和是加上前面已经求的,所以首元素也是原来的首元素,即 i-1 时的首元素。 反之的话,下标等于下一个元素的下标(i+1),因为已经确定了这个数和之前的数都不是最大字段和的了。
代码如下:
#include<iostream>
#include<cstring>
using namespace std;
int maxx(int a,int b)
{
if(a>b)
return a;
return b;
}
int main()
{
int n;
int p[10010];
int dp[10010][2]; //dp[][0]代表字段和 dp[][1]代表该出的首元素的下表
while(cin>>n&&n)
{
memset(p,0,sizeof(p));
memset(dp,0,sizeof(dp));
int flag=0;
for(int i=1;i<=n;i++)
{
cin>>p[i];
if(p[i]>=0)
flag=1;
}
if(flag==0) //小优化,也是一步处理,如果都小于0的情况
{
cout<<"0 "<<p[1]<<" "<<p[n]<<endl;
continue;
}
if(p[1]>0)
{
dp[1][0]=p[1];
dp[1][1]=1;
}
else
{
dp[1][0]=0;
dp[1][1]=2;
}
for(int i=2;i<=n;i++)
{
if(dp[i-1][0]+p[i]>0) //如果满足条件
{
dp[i][0]=dp[i-1][0]+p[i]; //得到字段和
dp[i][1]=dp[i-1][1]; //得到首元素下标 等于之前的
}
else //反之
{
dp[i][0]=0;
dp[i][1]=i+1; //首元素坐标为下一个数的下标 因为 该数和之前的数都确定排除了,只能从下一个开始
}
}
int maxx=0,cnt=0;
for(int i=1;i<=n;i++)
{
//cout<<dp[i][1]<<" ";
if(maxx<dp[i][0])
{
maxx=dp[i][0];
cnt=i;
}
}
cout<<dp[cnt][0]<<" "<<p[dp[cnt][1]]<<" "<<p[cnt]<<endl;
}
return 0;
}
- 1003 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- 最大连续子序列
- BZOJ2956:模积和
- Scala---Akka Actor(一)tutorial-2
- C++虚函数及虚函数表在内存中的分配和访问
- 随笔一
- [日常套路] Boyer–Moore majority vote algorithm
- 1003 最大连续子序列
- CF825E:Minimal Labels(拓扑排序)
- HDU— 5968 异或密码
- android 服务
- HDU-2064-汉诺塔III
- Android Arcgis(13)、Gdal简单写个shp文件
- Jdbc事务笔记
- torch mac openmp
- 爬虫中的'伪装者'--header