题解 | #最美数字花环#

最美数字花环

https://ac.nowcoder.com/acm/contest/70759/F

一道动态规划求最大子序和的问题,需要知道的是,这里是环,我们需要将环展开成线处理,每一次找最大的子序和,然后把它拿走(变为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;
}
竞赛奋斗日志 文章被收录于专栏

一个奋斗的蒟蒻

全部评论

相关推荐

嵌入式求职之路:可以看我经验😂,https://www.nowcoder.com/share/jump/73221730841876945
点赞 评论 收藏
分享
认真搞学习:28小登的建议,投算法岗不要写什么物理竞赛,互联网+,多写点项目,用什么算法做了什么。还有本科算法是不可能的开发你这个也没有项目啊
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务