[动态规划]下载插件中关于dp[(i+1)/2]+1的理解

小扣打算给自己的 VS code 安装使用插件,初始状态下带宽每分钟可以完成 1 个插件的下载。假定每分钟选择以下两种策略之一:

  • 使用当前带宽下载插件
  • 将带宽加倍(下载插件数量随之加倍)
    请返回小扣完成下载 n 个插件最少需要多少分钟。

注意:实际的下载的插件数量可以超过 n 个

[动态规划]下载插件中关于dp[(i+1)/2]+1的理解_第1张图片

class Solution {
public:
    //关于dp[(i+1)/2]+1? 
    // 这里不要考虑速度去理解!!
    // 假设dp[5] = 4,也就是表示在这时的速度是能够在4min处理5个的,那如果我不加速,
    // 其实就是8分钟处理10个,但是,我们知道插件加速就是速度*2,即速度加倍,
    // 现在我想带宽加倍,让速度加倍使得能够4min处理10个,如此就是dp[(i+1)/2],
    // 加速还花了1min,所以加上1
    // 所以 dp[(i+1)/2]+1 表示我要用同样的时间做两倍的事情,但前提需要1min来加速
    int leastMinutes(int n) {
        vector<int> time(n+1);
        time[0] = n;
        if(n==1) return 1;
        if(n>1){  
            for(int i = 1;i<=n;i++){
                time[i] = min(time[i-1]+1,time[(i+1)/2]+1);
            }
        }
        return time[n];
    }
};

你可能感兴趣的:(leetcode题记录,动态规划,算法,c++)