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

洛谷 P1651 塔 题解

题目链接

洛谷 P1651 塔

思路分析

Task 1

考虑动态规划。我们定义 \(dp_{j,k}\) 表示当一塔高度为 \(j\),另一塔高度为 \(k\) 能否搭出。那么 \(dp_{j,k}=dp_{j,k}\lor dp_{j-a_i,k}\lor dp_{k,j-a_i}\),其中 \(i\) 枚举木块。但是根据题目要求这样写会 TLE+MLE,需要优化。

Task 2:差值 DP

观察到我们这样写只利用了下标,浪费了数组元素值这一存储数据的方法。我们考虑用元素值存储塔高,那么下标呢?由于我们只关注这两座塔是不是一样高,即高度差是否为 \(0\),所以可以定义 \(dp_{i,j}\) 表示使用前 \(i\) 个木块,当两塔高度差为 \(j\) 时,较低的那座塔的高度。那么对于当前木块 \(i\),分以下几种情况。

  • 不用木块 \(i\)\(dp_{i,j}=dp_{i-1,j}\)

  • 用木块 \(i\),放在低塔

    • 若低塔仍为低塔,则高度差减少 \(a_i\),低塔高度增加 \(a_i\),所以 \(dp_{i,j}=dp_{i-1,j-a_i}+a_i\)
    • 若低塔变成了高塔,则高度差就变为 \(a_i-j\),低塔高度变为原高塔高度,增加了 \(j\),即 \(dp_{i,j}=dp_{i-1,a_i-j}+j\)

    所以 \(dp_{i,j}=dp_{i-1,|j-a_i|}+\min{(j,a_i)}\)

  • 用木块 \(i\),放在高塔,则高度差增加 \(a_i\),所以 \(dp_{i,j}=dp_{i-1,j+a_i}\)

综上,状态转移方程如下,其中 \(i,j\) 含义与定义相同,由题意一开始只有 \(dp_{0,0}\) 可以拼出,所以初始化为 \(0\),其它则为一极小值。

\[dp_{i,j}=\min{(dp_{i-1,j},dp_{i-1,|j-a_i|}+\min(j,a_i),dp_{i-1,j+a_i})} \]

代码见最下方,时空复杂度均为 \(O(n\sum{a_i})\)

Task 3:滚动数组优化

发现 \(dp_{i,j}\) 的更新只与上一行的数据有关,所以可以进行优化,用两个数组记录本行和上一行的数据。代码略。

代码呈现

此处为 Task 2 代码。

#include<bits/stdc++.h>
using namespace std;const int N=55,M=500010;
int n,m;
int a[N],dp[N][M];int main(){scanf("%d",&n);for (int i=1;i<=n;++i) scanf("%d",a+i);for (int i=1;i<=n;++i) m+=a[i]; // a[i] 之和memset(dp,-0x3f,sizeof dp); // 注意初始化dp[0][0]=0;for (int i=1;i<=n;++i){for (int j=0;j<=m;++j)dp[i][j]=max({dp[i-1][j],dp[i-1][abs(j-a[i])]+min(j,a[i]),dp[i-1][j+a[i]]});}printf("%d",(dp[n][0]>0?dp[n][0]:-1));return 0;
}
http://www.jsqmd.com/news/295139/

相关文章:

  • 热销榜单:2026年在线制作二维码推荐,帮你轻松打造个性化二维码!
  • vllm Qwen2.5-0.5B输出乱码解决办法 用-Instruct版本的
  • 二维码在图片传播中的重要性是什么?
  • 从零学网络安全 - 网络安全基础(二)
  • 导师推荐10个AI论文平台,研究生高效写作必备!
  • 让 uv 直接使用 conda 的环境
  • 人群仿真软件:SimWalk_(9).结果分析与可视化
  • 人群仿真软件:SimWalk_(10).案例学习与应用
  • 人群仿真软件:SimWalk_(10).人群应急疏散仿真
  • 人群仿真软件:SimWalk_(11).高级功能探索
  • 【MIMO通信】大规模多元MIMO系统中的低复杂混合预编码附Matlab代码
  • 【无人机三维路径规划】基于人工势场路径规划算法实现无人机UAV和自主水下航行器AUV路径规划附matlab代码
  • 从零开始学AI产品经理:4大方向选择+薪资分析+转型建议,建议收藏
  • AI产品经理与传统产品经理的区别,大模型时代产品经理进阶指南
  • Golang WebSocket的多客户端管理
  • 2026年的第一篇
  • 提升开题报告质量:9款人工智能工具与专业模板修改技巧分享
  • 9种AI驱动的高效工具组合,助力毕业论文开题报告模板修改
  • 学术研究新选择:9大智能工具改写毕业论文开题报告模板
  • 比话降AI vs 嘎嘎降AI:知网检测实测对比,哪款更适合你
  • 比话降AI vs 降迹灵:8元和2.3元效果差多少
  • 知网AIGC检测不通过?3步搞定从被退到通关
  • 毕业季必备:5款降AI工具帮你论文顺利过检
  • 3款知网降AI工具实测:比话、PaperRed、嘎嘎效果对比
  • 2026年5款论文降AI工具亲测推荐,知网AI率轻松降到15%以下
  • 定义中的【谓词】是什么
  • 偏远地区设计学生就业难?远程工作接单,实现高薪自由职业
  • 公理化方法
  • 针对毕业论文开题报告撰写需求,推荐9款高效AI工具与模板修改方案
  • 利用RabbitMQ优化大数据系统的消息传输