动态规划解按摩师的最长预约时间
动态规划解按摩师的最长预约时间
问题描述:
一名有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或者不接。在每次预约服务之间要有休息时间,因此她不能接受相邻时间的预约。
给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。
示例1
输入 [1,2,3,1]
输出 4
解释 选择1号和3号预约,总时长1+3=4
示例2
输入 [2,7,9,3,1]
输出 12
解释 选择1、3、5号预约,总时长2+9+1=12
示例3
输入 [2,1,4,5,3,1,1,3]
输出 12
解释 选择1、3、5、8号预约,总时长2+4+3+3=12
动态规划解决
数组中的值表示的是预约时间,
按摩师可以选择接或者不接,
如果前一个接了,那么下一个肯定是不能接的,
因为按摩师不能接相邻的两次预约。
如果上一次没接,那么下一个可以选择接也可以选择不接。
这里可以定义一个二维数组dp[length][2],其中dp[i][0]表示第i+1个预约没有接的最长总预约时间,dp[i][1]表示的是第i+1个预约接了的最长总预约时间。
递推公式
dp[i][0] = max(dp[i-1][0],dp[i-1][1])
dp[i][1] = dp[i-1][0] + arr[i]
dp[0][0] = 0
dp[0][1] = arr[0]
代码详情
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int main()
{
//int arr[] = {2,7,9,2,1};
//int len = sizeof(arr)/sizeof(arr[0]);
int n=0;
cout<<"序列长度:";
cin >> n;
int arr[n];
cout<<"序列:";
for(int i=0;i<n;i++){
cin>>arr[i];
}
int len = n;
int dp[len][2];
dp[0][0] = 0;
dp[0][1] = arr[0];
for(int i=1;i<len;i++){
dp[i][0] = max(dp[i-1][0],dp[i-1][1]);
dp[i][1] = dp[i-1][0] + arr[i];
}
for(int i=0;i<2;i++){
for(int j=0;j<len;j++){
cout<<dp[j][i]<<" ";
}
cout<<endl;
}
return 0;
}
实例2:动态规划dp表格
0 | 2 | 7 | 11 | 11 |
---|---|---|---|---|
2 | 7 | 11 | 9 | 11 |
分类:
数据结构与算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通