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;
}
}