一道动态规划求最大子序和的问题,需要知道的是,这里是环,我们需要将环展开成线处理,每一次找最大的子序和,然后把它拿走(变为0)

#include<bits/stdc++.h>
using namespace std;
int n;
const int M=2e5+5;
int dp[M<<1];
int a[M<<1];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>dp[i];
		a[i]=dp[i];
	} 
	int cn=1;
	for(int i=n+1;i<=2*n;i++){
		dp[i]=dp[cn];
		a[i]=a[cn++];
	}
	int st=1,en=1,p=1;
	int maxn=dp[1];
	for(int i=2;i<=n;i++){
		if(dp[i-1]+dp[i]>=dp[i])
			dp[i]=dp[i-1]+dp[i];
		else p=i;
		if(dp[i]>maxn){
			maxn=dp[i];
			st=p; en=i;
		}
	}
	for(int i=st;i<=en;i++){
		a[i]=0;
	}
	for(int i=st+n;i<=en+n;i++){
		a[i]=0;
	}
////	for(int i=1;i<=2*n;i++){
//		cout<<a[i]<<" ";
//	}
//	cout<<endl;
//	cout<<st<<" "<<en<<endl;
	int maxn1=a[1];
	for(int i=2;i<=2*n;i++){
		if(a[i-1]+a[i]>=a[i])
			a[i]=a[i-1]+a[i];
		else p=i;
		if(a[i]>maxn1){
			maxn1=a[i];
		}
	}
//	cout<<maxn<<" "<<maxn1<<endl;
	cout<<maxn+maxn1<<endl;
}