AcWing 1025. 开餐馆 (线性dp)

简介: 笔记

1025. 开餐馆


题意

信息学院的同学小明毕业之后打算创业开餐馆.现在共有 n 个地点可供选择。


小明打算从中选择合适的位置开设一些餐馆。


这 n个地点排列在同一条直线上。


我们用一个整数序列 m 1 , m 2 , … , m n 来表示他们的相对位置。


由于地段关系,开餐馆的利润会有所不同。我们用 p i 表示在 m i处开餐馆的利润。


为了避免自己的餐馆的内部竞争,餐馆之间的距离必须大于 k。


请你帮助小明选择一个总利润最大的方案。


思路

线性dp模板题


状态表示:f[i] 表示从前 i 个餐馆中选择如何开店的利润的最大值


状态转移:可以将状态划分成倒数第二个选择哪个餐馆 有两种状态


第一种:倒数第二个餐馆离当前的餐馆距离大于 k 那么可以共存


第二种:倒数第二个餐馆离当前的餐馆距离小于等于 k 要么选择当前的餐馆 要么舍弃当前的餐馆


代码

#include<bits/stdc++.h>
#define INF 0x3f3f3f3f
#define mod 998244353
#define endl '\n'
using namespace std;
typedef long long LL;
typedef pair<int, int>PII;
const int N = 600;
int n, k;
int m[N], p[N];
int f[N];
void solve() {
  cin >> n >> k;
  for (int i = 1; i <= n; ++i)scanf("%d", &m[i]);
  for (int i = 1; i <= n; ++i)scanf("%d", &p[i]);
  memset(f, 0, sizeof f);
  f[1] = p[1];
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= i; ++j) {
      if (m[j] + k < m[i]) //如果可以选当前的餐馆
        f[i] = max(f[i], f[j] + p[i]);
      else f[i] = max(f[i], f[j]); //不能选当前的餐馆情况下的选择一:选择之前的
                            //舍弃现在的
    }
    f[i] = max(f[i], p[i]); //不能选当前餐馆的情况下的选择二:选择现在的 舍弃之前的
  }
  cout << f[n] << endl;
}
int main() {
  int t; cin >> t;
  while(t--)
    solve();
  return 0;
}
目录
相关文章
|
1月前
|
人工智能 算法 BI
AcWing 505. 火柴排队(每日一题)
AcWing 505. 火柴排队(每日一题)
|
1月前
|
算法
AcWing 1343. 挤牛奶(每日一题)
AcWing 1343. 挤牛奶(每日一题)
|
5月前
【洛谷 P1002】[NOIP2002 普及组] 过河卒 题解(递归+记忆化搜索)
`NOIP2002`普及组的过河卒问题是一个棋盘路径计数挑战。卒从$(0,0)$出发到$(n,m)$,只能向下或向右移动,马在$(c1,c2)$固定,控制某些点。任务是计算不受马阻挡的路径数。输入是目标和马的位置,输出是路径总数。使用动态规划和记忆化搜索避免重复计算,样例输入$(6,6,3,3)$输出$6$。代码中定义了$f(x,y)$计算$(x,y)$处的路径数,利用边界条件和递推关系计算。
69 0
|
5月前
|
算法
【洛谷 P1003】[NOIP2011 提高组] 铺地毯 题解(数组+贪心算法)
**NOIP2011 提高组问题:铺地毯** 在第一象限的颁奖典礼场地,有$n$张地毯按编号顺序铺设。需找出覆盖特定点$(x, y)$的最上方地毯编号。输入包括地毯坐标和点坐标,输出地毯编号或-1表示未覆盖。 样例:给定3张地毯,点$(2,2)$被第3张地毯覆盖,输出3;另一样例点$(4,5)$未被覆盖,输出-1。 $30\%$数据$n\leq2$,$50\%$数据坐标$\leq100$,$100\%$数据$n\leq10^4$,坐标$\leq10^5$。 解决方法:从下到上遍历地毯,更新覆盖点的地毯编号。 AC代码略。
50 0
|
5月前
|
存储 C++
【洛谷 P1089】[NOIP2004 提高组] 津津的储蓄计划 题解(循环)
**摘要:** 这是一个关于编程竞赛题目的摘要,题目编号NOIP2004提高组,名为“津津的储蓄计划”。津津每月初从妈妈那里获得300元,需要根据预算决定储蓄。若预计月底有超过或正好100元,她会存储整百金额。如果某月资金不足预算,输出第一个这样的月份加负号;否则,计算年末时津津手中的总金额(储蓄部分加20%)。输入是12个月的预算,输出是一个整数结果。提供的C++代码示例用于处理这个问题,通过迭代计算每个月的资金状况。样例输入和输出展示了不同情况下的结果。
54 0
|
6月前
蓝桥备战--分糖果OJ2928 贪心 分类讨论
蓝桥备战--分糖果OJ2928 贪心 分类讨论
65 0
【每日一道智力题】之如何最快的找到最轻的砝码
【每日一道智力题】之如何最快的找到最轻的砝码
208 0
洛谷P1135 奇怪的电梯——广搜
洛谷P1135 奇怪的电梯——广搜
103 0
(数论)蓝桥杯AcWing 1205. 买不到的数目
(数论)蓝桥杯AcWing 1205. 买不到的数目
47 0
|
算法
【递归与递推】洛谷[NOIP2002 普及组] 过河卒
前言 本题来自洛谷P1002. 题目链接:[NOIP2002 普及组] 过河卒 - 洛谷
224 0