【动态规划】牛客每日一题 8月4日 NC14526-购物

这篇博客介绍了如何运用动态规划解决牛客网的每日一题NC14526,该问题涉及购买糖果以确保每天至少吃一颗,同时支付最低费用。解题思路包括定义dp状态转移方程,通过枚举天数和糖果数量找到最优解。
摘要由CSDN通过智能技术生成

传送门

关于dp,看到一篇很好的博客:到底什么是dp思想(内含大量经典例题,附带详细解析)

题干:
在遥远的东方,有一家糖果专卖店。
这家糖果店将会在每天出售一些糖果,它每天都会生产出m个糖果,第i天的第j个糖果价格为C[i][j]元。
现在的你想要在接下来的n天去糖果店进行选购,你每天可以买多个糖果,也可以选择不买糖果,但是最多买m个。(因为最多只生产m个)买来糖果以后,你可以选择吃掉糖果或者留着之后再吃。糖果不会过期,你需要保证这n天中每天你都能吃到至少一个糖果。
这家店的老板看你经常去光顾这家店,感到非常生气。(因为他不能好好睡觉了)于是他会额外的要求你支付点钱。具体来说,你在某一天购买了 k 个糖果,那么你在这一天需要额外支付 k^2的费用。
那么问题来了,你最少需要多少钱才能达成自己的目的呢?

思路:

  • 求花最少的钱,使得 n 天至少每天吃一颗糖
  • 可以知道,应该只买 n 颗糖,并且买每天更便宜的糖(每日糖的价格由低到高排序)
  • 涉及到最优决策,考虑用 dp 解决。
    dp[i][j] 表示:前 i 天买了 j 颗糖 花费的最少钱数。可以由(前 i-1 天 + 第 i 天)推过来。
    状态转移方程(前 i-1 天买了 k 颗糖):
    dp[i][j] = min( dp[i][j] , dp[i-1][k] + sum[i][j-k] + (j-k)*(j-k) );
  1. 枚举天数 for(int i=1; i<=n; i++)

  2. 枚举前 i 天买的糖果数 for(int j=i; j<=min(n, i*m); i++)
    2.1   由于前 i 天一定至少买了 i 个糖果,所以 j 从 i 开始;
    2.2    j 一定小于等于 n(一共需要买 n 颗) 和 i*m(前 i 天生产的最大量),取最小值

  3. 枚举前 i-1 天买的糖果数 for(int k=i-1; k<=min(n, (i-1)*m)&&k<=j; k++)
    3.1   由于前 i-1 天一定至少买了 i-1 个糖果,所以 k 从 i-1 开始;
    3.2    j 一定小于等于 n(一共需要买 n 颗) 和 (i-1)*m(前 i 天生产的最大量),取最小值;且 k 一定小于等于 j 。

  • 最后输出 dp[n][n],表示前 n 天买了 n 颗糖花费的最少钱数。
#include <bits/stdc++.h>
using namespace std;

int c[
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
动态规划在解决牛客删除括号问题时,可以按照以下步骤进行: 1. 首先,我们需要理解题目的需求。题目要求我们删除括号,使得剩下的字符串满足以下条件:左括号和右括号的数量相等,且左括号的位置必须在右括号的前面。 2. 接下来,我们可以使用动态规划来解决这个问题。我们可以定义一个三维的dp数组,其中dp[q][w][e]表示考虑s前q个字符,t前w个字符,且s被删除部分左括号数减去右括号数为e时,是否可行(bool类型)。 3. 然后,我们可以从前向后遍历字符串s和t。在每一步中,我们可以考虑两种情况: a. 删除的左括号数目比右括号多:我们可以继续删除左括号,或者删除右括号。即dp[q][w][e] = dp[q-1][w][e+1]或dp[q-1][w][e-1]。 b. 删除的左括号数目与右括号数目相同:我们只能删除右括号。即dp[q][w][e] = dp[q-1][w-1][e-1]。 4. 最后,我们可以根据dp[len1][len2][0]的值来判断是否可行。其中len1和len2分别表示字符串s和t的长度。 综上所述,通过动态规划的思路,我们可以解决牛客删除括号的问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [动态规划笔记](https://download.csdn.net/download/weixin_38617297/13751806)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [牛客_21303删括号_动态规划](https://blog.csdn.net/weixin_45619006/article/details/114650172)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值