当前位置: 首页 > news >正文

candy P14328: dp优化

P14328 [JOI2022 预选赛 R2] 糖 2 / Candies 2 题解

题目链接:p14328

题意描述

有 $N$ 个糖果排成一列,每个糖果有一个美味度 $A_i$。需要选择糖果,使之满足限制:对于任意连续的 $K$ 个糖果,最多只能选择其中 $2$ 个。并在满足限制的条件下,最大化所选糖果的美味度总和。

数据范围:$2 \le K \le N \le 3000$

解题思路

动态规划

在写题的时候很容易想到要使用 $dp$,那怎么设计呢?发现选取 $i$ 的情况是由 $j \in [i-k+1,i-1]$ 转移得到,而对于 $dp[j]$ 我们选取其所有转移到 $j$ 的最大值。

状态定义

定义 $dp[i][j]$ 表示选择第 $i$ 个糖果,并且从第 $j$ 个位置转移过来的最大美味度总和。

同时定义 $ma_dp[i][j]$ 作为前缀最大值数组,用于优化时间复杂度,表示前 $j$ 个位置中最大的 $dp[i][j]$ 值。

并将 $dp[i][i]$ 初始化为 $wi[i]$,即选取一个点的情况。

状态转移

对于每个糖果 $i$,我们考虑:

选择第 $i$ 个糖果,并与之前某个糖果 $j$ 组合:

  • 需要满足 $j$ 和 $i$ 的距离不超过 $K$(即 $i-k+1 \le j < i$),如果超过,直接取其最大值,因为我们可以中间不选。
  • 转移方程为:$dp[i][j] = \max\limits_{1 \le k \le \min(j, i-K)} max_dp[j][k] + A_i$

前缀最大值优化

为了快速获取前 $j$ 个位置中的最大值,我们使用 $ma_dp[i][j]$ 数组:

  • $ma_dp[i][j] = ma_dp[j][pre]+wi[i]$,其中 $pre$ 是选完 $j$ 后最后合法的位置。

代码实现

#include <bits/stdc++.h>
using namespace std;
#define int long long
constexpr int maxn=3e3+10;
constexpr int maxm=2e5+10;
constexpr int INF = 0x3f3f3f3f3f3f3f3f;int n,k;
int wi[maxn];
int dp[maxn][maxn]; // dp[i][j] i第个点,从j转移的最大值
int ma_dp[maxn][maxn]; // 前缀最大值数组signed main()
{scanf("%lld%lld",&n,&k);int ans=0;for(int i=1;i<=n;++i){scanf("%lld",wi+i);}for(int i=1;i<=n;++i){ dp[i][i]=wi[i];for(int j=i-k+1;j<i;++j){int pre=max(0LL,i-k);// 小于0不合法不转移if(pre){if(pre>j){pre=j;// 不想思考了,直接特判,pre>j意味着j可以任意选取,由于我们需要前面全部的可能,所以取j最大值}dp[i][j]=ma_dp[j][pre]+wi[i];}else {dp[i][j]=wi[i]+wi[j];// pre==0 直接算j和i的价值(因为是从j转移到i的)}ans=max(ans,dp[i][j]);}for(int j=1;j<=i;++j){ma_dp[i][j]=max(ma_dp[i][j-1],dp[i][j]);// 预处理ma_dp}}printf("%lld\n",ans);return 0;
}

复杂度分析

  • 时间复杂度:$O(N^2)$,因为有两层循环分别遍历 $N$ 个糖果和最多 $K$ 个转移位置
  • 空间复杂度:$O(N^2)$,用于存储 $dp$ 和 $ma_dp$ 数组
http://www.jsqmd.com/news/36539/

相关文章:

  • 配对序列P11187: 线性dp
  • 2025年新疆广告公司权威推荐榜单:geo服务商/广告加盟/营销推广公司机构精选
  • 计算机毕设java的仓库管理系统 基于Java的智能仓库管理平台研发 Java技术驱动的仓库信息化管理系统设计与实现
  • 吴恩达深度学习课程二: 改善深层神经网络 第二周:优化算法(三)Momentum梯度下降法
  • 2025年大棚专用农膜供应商权威推荐榜单:双色大棚膜/大棚eva农膜/三层共挤大棚膜源头厂家精选
  • 【GitHub每日速递 20251110】开源AI编码神器OpenCode来袭!多平台安装,多模型适配,终端体验拉满
  • Gitee战略升级:从代码托管到AI驱动的工程效率平台
  • springboot项目上传到gitlab
  • 2025年重庆抖音推广机构推荐榜单:杰诚智享领衔行业前沿
  • Oracle OGG日常运维命令都在这里了。
  • flask: 报错:ImportError: cannot import name secure_filename from werkzeug
  • 2025年立式护散炉定制厂家权威推荐榜单:8英寸立式退火炉/立式合金炉/磷扩散炉源头厂家精选
  • 详细介绍:物联网常见通信Cat-1、NB-IoT、Cat-4、LoRa
  • 在Tuanjie引擎中使用自定义Webview
  • 2025年伸缩门生产厂家综合排名前十权威推荐
  • 洛阳伸缩门公司哪家强?2025年排名
  • 2025年11月中国伸缩门制造企业推荐排行榜单:智能出入管理解决方案权威指南
  • 100% 用 AI 做完一个新项目,从 Plan 到 Finished 我学到了这些
  • Gitee:构建国产化DevSecOps生态的领航者
  • 2025年重庆互联网公司排行榜单:诚信服务商top10
  • 小程序逆向调试分析学习
  • 2025年成都镀锌桥架厂家综合实力排行榜前十强权威发布
  • 2025年重庆互联网营销推荐排行榜
  • 2025年11月重庆互联网代运营服务推荐:专业团队
  • 大模型教程资源分享
  • 2025年西南铝单板工厂排行榜:top10实力厂家推荐
  • 2025年天然气热风炉供货厂家权威推荐榜单:燃气热风机/燃气热风炉/直燃式燃气热风炉源头厂家精选
  • 2025年山茶叶礼盒供货厂家权威推荐榜单:碧螺红茶礼盒/碧螺红茶/碧螺春茶叶礼盒源头厂家精选
  • IntelliJ IDEA 2025.2.4 11月最新版 安装、授权、使用说明
  • 2025年上海出国留学服务商综合排名前十强权威推荐