每日OJ_牛客_宵暗的妖怪_DP_C++_Java

目录

牛客_宵暗的妖怪_DP

题目解析

C++代码

Java代码


牛客_宵暗的妖怪_DP

宵暗的妖怪

描述:

露米娅作为宵暗的妖怪,非常喜欢吞噬黑暗。这天,她来到了一条路上,准备吞噬这条路上的黑暗。这条道路一共被分为n 部分,每个部分上的黑暗数量为ai​ 。

露米娅每次可以任取 连续的 未被吞噬 过的三部分,将其中的黑暗全部吞噬,并获得中间部分的饱食度。露米娅想知道,自己能获得的饱食度最大值是多少?

输入描述:

第一行一个正整数n ,代表道路被分的份数。

第二行有n 个正整数ai ,代表每一部分黑暗数量。

数据范围:3≤n≤100000,1≤ai≤10^9

输出描述:

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


题目解析

打家劫舍,但是别抢到最后一家就行。

打家劫舍问题复习:

Offer必备算法15_简单多问题dp_八道力扣题(打家劫舍+买卖股票)-CSDN博客

以某个位置为结尾,结合题目要求,dpi 表示:选择到 i 位置时,此时的最大金额。

但是我们这个题在 i 位置的时候,会面临选择或者不选择两种抉择,所依赖的状态需要细分:

fi 表示:选择到 i 位置时, numsi 必选,此时的最大金额;

gi 表示:选择到 i 位置时, numsi 不选,此时的最大金额。

因为状态表示定义了两个,因此状态转移方程也要分析两个:

对于 fi : 如果 numsi 必选,那么仅需知道 i - 1 位置在不选的情况下的最大金额, 然后加上 numsi 即可,因此 fi = gi - 1 + numsi

对于 gi : 如果 numsi 不选,那么 i - 1 位置上选或者不选都可以。因此,我们需要知道 i - 1 位置上选或者不选两种情况下的最大金额,因此 gi = max(fi - 1, gi - 1) 。

C++代码

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;
#define int long long

signed main()
{
    int n = 0;
    cin >> n;
    vector<int> arr(n + 1);
    for(int i = 1; i <= n; ++i)
    {
        cin >> arr[i];
    }
    vector<int> dp(n + 1);
    for(int i = 3; i <= n; ++i)
    {
        dp[i] = max(dp[i - 1], dp[i - 3] + arr[i - 1]); // 不拿和拿
    }
    cout << dp[n] << endl;
    return 0;
}

Java代码

cpp 复制代码
import java.util.*;
public class Main
{
    public static void main(String[] args)
    {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        long[] arr = new long[n + 1];
        for(int i = 1; i <= n; i++)
        {
            arr[i] = in.nextLong();
        }
        long[] dp = new long[n + 1];

        for(int i = 3; i <= n; i++)
        {
            dp[i] = Math.max(dp[i - 3] + arr[i - 1], dp[i - 1]);
        }

        System.out.println(dp[n]);
    }
}
相关推荐
niucloud-admin4 分钟前
JAVA V6 多商户商城 开发文档——插件目录结构
java·开发语言
2601_962885725 分钟前
如何用 Python 扫描 A 股跳空缺口并统计缺口回补概率?
java·前端·python
anew___7 分钟前
蜂鸣器播放音乐——让 Arduino 唱出旋律
c++·stm32·单片机·嵌入式硬件·c
吞下星星的少年·-·9 分钟前
The 2026 ICPC Asia East Continent Online Contest (II)(构造)
数据结构·算法
滕州市燕猫虎计算机科技工作室个体工商户13 分钟前
Java锁
java·开发语言
stolentime1 小时前
洛谷P10515 转圈题解
c++·算法·数学建模·贪心算法
shehuiyuelaiyuehao2 小时前
1计算机是如何工作的
java·计算机网络
tdtsmt2 小时前
穿戴硬件量产工艺实录:天地通电子智能手表主板 SMT 贴片案
c++
和裕3 小时前
蜂窝板 vs 七层瓦楞重型纸箱:大件工业设备运输性能与成本全对比
大数据·运维·网络·人工智能·算法
衡石科技3 小时前
Data_Agent记忆机制与经验复用衡石分析智能体会话记忆与长期学习技术解析
人工智能·科技·学习·算法·企业级bi