程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Leetcode 動態規劃 Candy

Leetcode 動態規劃 Candy

編輯:C++入門知識

Leetcode 動態規劃 Candy


 

 

Candy

Total Accepted: 16494 Total Submissions: 87468My Submissions

 

There are N children standing in a line. Each child is assigned a rating value.

You are giving candies to these children subjected to the following requirements:

  • Each child must have at least one candy.
  • Children with a higher rating get more candies than their neighbors.

    What is the minimum candies you must give?


     



    題意:n 個小孩,每個小孩有一個評分。給小孩發糖。要求:
    1)每個小孩至少一顆糖
    2)評分高的小孩發的糖比他旁邊兩個小孩的多
    思路:左右 dp
    用一個數組 candy[n],表示第 i 個小孩所應該發的最少糖果數
    數組 ratings[n] 表示每個小孩的評分
    1.從左到右掃描一遍, candy[i] = 1, if ratings[i] <= ratings[i-1] ; candy[i] = candy[i-1] + 1, if ratings[i] > ratings[i-1]
    2.從右到左掃描一遍, candy[i] = candy[i], if ratings[i] <= ratings[i+1] ; candy[i] = max(candy[i], candy[i+1] + 1), if ratings[i] > ratings[i+1]
    3.accumulate(candy, candy + n, 0)

    復雜度: 時間 O(n), 空間 O(n)
     

    int candy(vector &ratings){
    	int n = ratings.size();
    	vector candy(n, 1);
    	for(int i = 1; i < n; ++i){
    		candy[i] = ratings[i] <= ratings[i - 1] ? 1 : candy[i - 1] + 1;
    	}
    	for(int i = n - 2; i > -1;--i){
    		candy[i] = ratings[i] <= ratings[i + 1] ? candy[i] : max(candy[i], candy[i + 1] + 1);
    	}
    	return accumulate(candy.begin(), candy.end(), 0);
    }


     

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved