1008: 最大连续子序列
使用了dp,dp【i】保存了1-i,我能找到的最好情况。
#include <bits/stdc++.h>
using namespace std;
struct node{
int ans;
int l;
int r;
bool operator==(const node& a)const{
if(ans==a.ans&&l==a.l&&r==a.r){
return 1;
}
return 0;
}
};
const int N=100010;
int n;
node dp[N];
int min_id=0;
int max_id=0;
void fun(int i){
if(dp[max_id].ans<dp[i].ans){
max_id=i;
}
else if(dp[max_id].ans==dp[i].ans){
if(dp[max_id].l>dp[i].l){
max_id=i;
}
else if(dp[max_id].l==dp[i].l&&dp[max_id].r>dp[i].r){
max_id=i;
}
}
}
int main(){
// node a={0,0,0};
// node b={1,0,0};
// if(a==b){
// cout<<"yes"<<endl;
// }
// else
// cout<<"no"<<endl;
while(scanf("%d",&n)!=EOF){
memset(dp,0,sizeof(dp));
int sum[N];
int num[N];
for(int i=1;i<=n;i++){ //输出答案的时候记得下标-1
scanf("%d",&num[i]);
sum[i]=sum[i-1]+num[i];
}
dp[0]={0,0,0};
min_id=0;
max_id=0;
for(int i=1;i<=n;i++){
if(num[i]<=0){ //==0?
dp[i]=dp[i-1];
}else{
if(dp[i-1].r==i-1){
dp[i].ans=dp[i-1].ans+num[i];
dp[i].r=dp[i-1].r+1;
dp[i].l=dp[i-1].l;
fun(i);
}
else if(sum[i]-sum[min_id]>dp[i-1].ans){
dp[i]={sum[i]-sum[min_id],min_id+1,i};
fun(i);
}
else if(sum[i]-sum[min_id]==dp[i-1].ans){
if(min_id+1<dp[i-1].l){
dp[i]={sum[i]-sum[min_id],min_id+1,i};
fun(i);
}
else {
dp[i]=dp[i-1];
}
}else{
dp[i]=dp[i-1];
}
}
if(sum[min_id]>sum[i]){
min_id=i;
}
}
if(dp[max_id].ans==0){ //不特判0的话,我会因为下面的-1输出0,-1,-1.
printf("0 0 0\n");
}
else
printf("%d %d %d\n",dp[max_id].ans,dp[max_id].l-1,dp[max_id].r-1);
}
}

浙公网安备 33010602011771号