zoukankan      html  css  js  c++  java
  • 动态规划解按摩师的最长预约时间

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

    问题描述:

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

    示例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
  • 相关阅读:
    微软一站式示例代码库 11月小结
    Linux服务器使用SSH的命令 [转]
    简明 Vim 练级攻略 [转]
    如何在Windows下使用LAPACK和ARPACK [转]
    使用setuptools自动安装python模块 [转]
    VS2010下GSL的配置 [转]
    poj3255 Roadblocks ***
    协方差矩阵的详细说明 [转]
    VC环境下LIB引用问题(LNK1104) [转]
    Dreamweaver CS5: "Configuration error"
  • 原文地址:https://www.cnblogs.com/Andre/p/13984208.html
Copyright © 2011-2022 走看看