动态规划解按摩师的最长预约时间

动态规划解按摩师的最长预约时间

问题描述:

一名有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或者不接。在每次预约服务之间要有休息时间,因此她不能接受相邻时间的预约。
给定一个预约请求序列,替按摩师找到最优的预约集合(总预约时间最长),返回总的分钟数。

示例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
posted @ 2020-11-16 12:24  Pudding10335  阅读(162)  评论(0编辑  收藏  举报