题目链接
魔法项链-小红书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;
}