http://acm.hdu.edu.cn/showproblem.php?pid=1231
hd1231.
最大连续子序列和,
状态是 dp[i] = max(a[i], dp[i-1] + a[i])
以i结尾的最大和.
然后直接找dp[i]最大的.
其中s[i]是dp[i]中起点.
最后st来存s[i],end来存结尾.
#include<iostream>
using namespace std;
int main()
{
int n;int max=1,st,end;
while(cin>>n)
{
if(n==0) break;
int f[10009],s[10009],a[10009];bool flag=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
for(int i=1;i<=n;i++)
{
if(a[i]>=0)
flag=1;
}
if(flag)
{
f[1]=a[1];
s[1]=1;
for(int i=2;i<=n;i++)
{
if(f[i-1]+a[i]>=a[i])
{
f[i]=f[i-1]+a[i];
s[i]=s[i-1];
}
else
{
f[i]=a[i];
s[i]=i;
}
}
max=-1;
for(int i=1;i<=n;i++)
{
if(max<f[i])
{
max=f[i];
st=s[i];
end=i;
}
}
cout<<max<<" "<<a[st]<<" "<<a[end]<<endl;
}
else
cout<<0<<" "<<a[1]<<" "<<a[n]<<endl;
}
}
不知道为何wa
<pre name="code" class="cpp">#include<iostream>
using namespace std;
int a[10009];
int f[1009];
int s[1009];//记录最大连续和的
int main()
{
//freopen("in.txt","r",stdin);
int n;
while(cin>>n)
{
if(n==0) break;
bool flag; flag=0;
for(int i=1;i<=n;i++)
{
cin>>a[i];
if(a[i]>=0)
flag=1;//判断是否为全负;
}
if(flag)//不为全负;
{
f[1]=a[1];
s[1]=1;
for(int i=2;i<=n;i++)
{
if(f[i-1]+a[i]>=a[i])//也就是说加上a[i]会更大
{
f[i]=f[i-1]+a[i];
s[i]=s[i-1];//起始点不变.
}
else
{
f[i]=a[i];
s[i]=i;//也就是重新开始.
}
}
//这里记录完成,找到以a[i]结尾的最大连续子序列和.下面开始寻找最大,和路径.
//for(int i=1;i<=n;i++)
//cout<<f[i]<<" ";//以i为结尾的最大连续子序列
// cout<<endl;
int max=f[1];
int st=1;
int end=1;
for(int i=2;i<=n;i++)
{
if(f[i]>max)
{
max=f[i];
st=s[i];//st[i]是记录的最大和的开始.
end=i;
}
}
cout<<max<<" "<<a[st]<<" "<<a[end]<<endl;
}
else
cout<<"0 "<<a[1]<<" "<<a[n]<<endl;
}
}