题解 | 最大连续子序列
#include <bits/stdc++.h> using namespace std; const int SIZE=10000; int dp[SIZE]; int main(){ int n; while(cin>>n){ if(n==0)break; memset(dp,INT_MIN,sizeof(dp)); int a[n]; for(int i=0;i<n;i++){ cin>>a[i]; } for(int i=0;i<n;i++){ if(i==0)dp[i]=a[i]; else dp[i]=max(a[i],dp[i-1]+a[i]); } int k=0,ans=dp[0]; for(int i=0;i<n;i++){ if(ans<dp[i]){ ans=dp[i]; k=i; } } int j=k; while(j>=0){ if(dp[j]!=a[j])j--; else break; } if(ans<0)cout<<0<<" "<<a[0]<<" "<<a[n-1]<<endl; else cout<<ans<<" "<<a[j]<<" "<<a[k]<<endl; } }
本题难度核心在找谁是开始,谁是结束,其实你分析一下这个dp数组的状态就可以知道,如果前面存在非最优解,会从该位置截断,取a[i]当前值,那么,我们就去找这个位置即可,然后就可以轻松解决,然后本题还有个要求,对小于0的特别输出,注意一下就可完美解决#大学最后一个寒假,我想……#