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);
	}
}
posted @ 2026-03-13 22:36  peter_shen  阅读(8)  评论(0)    收藏  举报