1. 程式人生 > >動態規劃演算法之最少糖果問題

動態規劃演算法之最少糖果問題

題目描述

N個孩子站在一條線上,給每個孩子分配一個數字,你需要滿足下面的要求給孩子們分糖果:

  1. 每個孩子至少有一個糖果
  2. 數字更大的孩子要比旁邊孩子的糖果多

你至少需要準備多少糖果分給孩子們?

題目解析

一開始看到這個題目的時候聯想到了數,因為沒看出來是動態規劃的題目,所以想出了一個常數時間複雜度的演算法,即從左至右遍歷陣列即可得出答案。
非動態規劃法大致思路為:從左至右遍歷陣列,(使用int inc和int dec表示當前數字連續變大的個數以及連續變小的個數)如果當前的數字比之前的數字大,那麼inc=1,然後將inc加到sum中;如果當前的數字比之前的數字小,那麼求遞減的和,當遞減結束時,去重。
動態規劃法

大致思路:

非動態規劃法C++程式碼實現
class Solution {
public:
    int candy(vector<int> &ratings) {
        int inc = 0, dec = 0;
        int sum = ratings.size();
        for (int i = 1;i < ratings.size();i++) {
            if (ratings[i] > ratings[i-1]) {
                inc += 1;
                sum += inc;
                dec = 0
; } else if (ratings[i] < ratings[i-1]) { for (; ratings[i] < ratings[i-1] && i < ratings.size();i++) { dec += 1; sum += dec; } sum -= inc > dec ? dec : inc; // 去重 inc = 0
; i--; } else { inc = 0; dec = 0; } } return sum; } }; /* * runtime:20ms * memory :532k * author :anonymous * date :2018年2月22日18:03:24 */
動態規劃法程式碼實現