魔法项链-小红书2024笔试(codefun2000)

题目链接
魔法项链-小红书2024笔试(codefun2000)

题目内容

你有一个魔法项链,现在你想要强化一下这件装备。你可以将魔法项链看做一条从头到尾串有 n 个不同魔力值宝石的绳子。根据你目前的冒险等级,你可以仅将其中的一颗宝石的魔力值强化并改变为 v
魔法项链的攻击力等于
任意连续
的几个宝石的魔力值之和的最大值。给定的项链与相应的冒险等级强化能力,请你计算强化后魔法项链的最大攻击力是多少?

输入描述

第一行三个整数,以空格分开,分别表示

输出描述

输出t行,每行输出一个整数,代表强化后魔法项链的最大攻击力。

样例1

输入

3
5 10
5 -1 -5 -3 2
2 -3
-5 -2
6 10
4 -2 -11 -1 4 -1

输出

15
-2
15

提示

第一组询问,强化第二个宝石。
第二组询问,不进行任何强化
第三组询问,强化第三个宝石。

题解1

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int N = 2e5 + 10;

int t, n, v, a[N];

// dp[i][0]表示以第i个元素结尾,并且没有使用强化的情况下,魔法项链所能获得的最大攻击力 
// dp[i][1]表示以第i个元素结尾,并且最多使用一次强化的情况下,魔法项链所能获得的最大攻击力。比如,dp[1][1]就是没有使用强化,魔法项链所能获得的最大攻击力) 
LL dp[N][2];

int main(){
	scanf("%d", &t);
	while(t--){
		memset(dp, 0, sizeof dp);
		LL ans = -1e18;
		scanf("%d%d", &n, &v);
		for(int i = 1; i <= n; i++){
			scanf("%d", &a[i]);
		}
		for(int i = 1; i <= n; i++){
			dp[i][1] = max((dp[i - 1][0] > 0 ? dp[i - 1][0]:0) + v, (dp[i - 1][1] > 0 ? dp[i - 1][1]:0) + a[i]);
			dp[i][0] = (dp[i - 1][0] > 0 ? dp[i - 1][0]:0)+a[i];
			ans = max(ans, max(dp[i][0], dp[i][1]));
		}
		printf("%lld\n", ans);
	}
	return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值