【算法】宵暗的妖怪

✨题目链接:

宵暗的妖怪


✨题目描述 

  • 露米娅作为宵暗的妖怪,非常喜欢吞噬黑暗。
  • 这天,她来到了一条路上,准备吞噬这条路上的黑暗。
  • 这条道路一共被分为n 部分,每个部分上的黑暗数量为ai 。
  • 露米娅每次可以任取 连续的 未被吞噬过的 三部分,将其中的黑暗全部吞噬,并获得中间部分的饱食度。
  • 露米娅想知道,自己能获得的饱食度最大值是多少?

✨输入描述:

  • 第一行一个正整数n ,代表道路被分的份数。
  • 第二行有n 个正整数ai  ,代表每一部分黑暗数量。
  • 数据范围:3≤n≤100000,1≤ai≤10^9 

✨输出描述:

 一个正整数,代表最终饱食度的最大值。

✨示例1

📍输入

7
2 4 1 4 2 1 8 

📍输出

📍说明

选择[2,4,1]和[4,2,1]这两段即可。饱食度为4+2=6。

✨示例2

📍输入

 7
2 4 1 7 2 1 8

📍输出

 7

📍说明

选择[1,7,2]这一段即可。饱食度为7。
值得注意的是,若取两段进行吞噬,反而最多只能获得6的饱食度,并不是最大的。

✨解题思路

 线性dp:

  • 状态表示:dp[i]表示从 [1,i] 区间内吞噬黑暗,最大的饱食度
  • 返回值:dp[n]
  • 状态转移方程:应该选择两种情况的最大值
  1. 选择绿色区间时dp[i]=dp[i-3]+v[i-1]
  2. 选择蓝色区间时dp[i]=dp[i-1]

✨代码
 

#include <iostream>
#include <vector>
using namespace std;

typedef long long ll;

int main()
{
    int n;
    cin >> n;
    vector<ll> v(n + 1);
    vector<ll> dp(n + 1);
    for (int i = 1; i <= n; i++)
    {
        cin >> v[i];
        if (i >= 3)
        {
            dp[i] = max(dp[i - 3] + v[i - 1], dp[i - 1]);
        }
    }
    cout << dp[n] << endl;
    return 0;
}


※ 如果文章对你有帮助的话,可以点赞收藏!!谢谢支持

  • 10
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一岁就可帅-

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值