NYOJ - 745 - 蚂蚁的难题(二)(最大子序列和变形,动态规划)

描述

下雨了,下雨了,蚂蚁搬家了。

已知有n种食材需要搬走,这些食材从1到n依次排成了一个圈。小蚂蚁对每种食材都有一个喜爱程度值Vi,当然,如果Vi小于0的时候,表示蚂蚁讨厌这种食材。因为马上就要下雨了,所以蚂蚁只能搬一次,但是能够搬走连续一段的食材。时间紧急,你快帮帮小蚂蚁吧,让它搬走的食材喜爱值和最大。

输入
有多组测试数据(以EOF结尾)。
每组数据有两行,第一行有一个n,表示有n种食材排成了一个圈。(1 <= n<= 50000)
第二行分别有n个数,代表蚂蚁对第n种食材的喜爱值Vi。(-10^9 <= Vi <= 10^9)
输出
输出小蚂蚁能够搬走的食材的喜爱值总和的最大。
样例输入
3
3 -1 2
5
-8 5 -1 3 -9
样例输出
5
7

 

看完题目,很容易联想到最大子串和,只不是这个序列是环形的。现在给出n个数的序列,我们把第一个元素和最后一个元素定义为环相接的地方。

相接的地方的情况有四种情况

1.第一个元素是正数,最后一个元素是正数

2.第一个元素是正数,最后一个元素是负数

3.第一个元素是负数,最后一个元素是正数

4.第一个元素是负数,最后一个元素是负数

我们定义min_sum最小和的子串 max_sum是最大和的子串,sum是n和元素的和

那么,我们要求的ans =max(max_sum,sum-min_sum);

易知最大子序列和中是不包含最小子序列和的,所以,最大子序列和是不横跨连接处的最大和。那么总和sum-最小和min_sum就是横跨连接处的最大和。我们要求的最大和就是在这两个数中找到较大的那一个。


注意:数据范围

#include<cstdio>
#include<cstring>
#include<algorithm>
#define N  50000+1
#define LL long long
using namespace std;
LL v[N],dp1[N],dp2[N];
LL n,max_sum,min_sum,sum;
int main(){
	while(scanf("%lld",&n)!=EOF){
		//初始化数组 
		memset(dp1,0,sizeof(dp1));
		memset(dp2,0,sizeof(dp2));
		sum=0;
		for(int i=1 ;i<=n ;i++){
			scanf("%lld",&v[i]);
			sum+=v[i];//元素总和 
			dp1[i] = max(dp1[i-1]+v[i],v[i]);
			dp2[i] = min(dp2[i-1]+v[i],v[i]);
		}
		max_sum=-9999999;
		min_sum=9999999;
		//求最大和与最小和 
		for(int i=1 ;i<=n ;i++){
			max_sum = max(max_sum,dp1[i]);
			min_sum = min(min_sum,dp2[i]);
		}
		
		LL ans = max(max_sum,sum-min_sum);
		
		printf("%lld\n",ans);
	}
	
	return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
孪生素数是指两个素数之间的差值为2的素数对。通过筛选法可以找出给定素数范围内的所有孪生素数的组数。 在引用的代码中,使用了递归筛选法来解决孪生素数问题。该程序首先使用循环将素数的倍数标记为非素数,然后再遍历素数数组,找出相邻素数之间差值为2的素数对,并统计总数。 具体实现过程如下: 1. 定义一个数组a[N,用来标记数字是否为素数,其中N为素数范围的上限。 2. 初始化数组a,将0和1标记为非素数。 3. 输入要查询的孪生素数的个数n。 4. 循环n次,每次读入一个要查询的素数范围num。 5. 使用两层循环,外层循环从2遍历到num/2,内层循环从i的平方开始,将素数的倍数标记为非素数。 6. 再次循环遍历素数数组,找出相邻素数之间差值为2的素数对,并统计总数。 7. 输出总数。 至此,我们可以使用这个筛选法的程序来解决孪生素数问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [python用递归筛选法求N以内的孪生质数(孪生素数)](https://blog.csdn.net/weixin_39734646/article/details/110990629)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [NYOJ-26 孪生素数问题](https://blog.csdn.net/memoryofyck/article/details/52059096)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值