POJ 4118 开餐馆 01背包问题变式

这篇博客主要解析了POJ 4118题目——开餐馆的问题,它是一个01背包问题的变种。博主通过遍历每个店铺是否开启,以及考虑前几个店铺的影响,利用动态规划的dp数组来求解最大收益。当相邻店铺距离小于等于k时,可以选择不增加店铺;否则,比较开启和不开店铺两种情况下的收益,选取较大者。博主建议先使用二维数组理解算法,再转换为滚动数组以优化空间复杂度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

POJ 4118 开餐馆 题目连接

思路
01背包问题的变式
遍历: i为考虑第 i 个店开不开
遍历: j为只考虑前 j 个店对开第 i 个店的影响
数组dp[ a ]:从前a个店挑选时的最大收益
两种情况:mi 和mj 的距离
1.不大于k:dp[ i ](j)=dp[ i ](j-1)
2.大于k:比较下面两种选更大的(不考虑 j 与 i 之间的店)
(1)不开店 i :dp[ i ](j)不变
(2)开店 i :dp[ i ](j)=dp[ j ]+ p[ i ]

注意:遍历的时候 j 的顺序无所谓,因为每次循环 j 只更新 dp[ i ]一个数据
注意:dp[ i ]的初始值要设为p[ i ]

备注
直接使用滚动数组的时候理解起来比较抽象,先用二位数组理解题意再改写成滚动数组更容易理解

#include <bits/stdc++.h>
using namespace std;
int main()
{
   
    int T,i,j,n,k;
    scanf(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值