有 N 个小孩站成一列。每个小孩有一个评级。
按照以下要求,给小孩分糖果:
-
每个小孩至少得到一颗糖果。
-
评级越高的小孩可以比他相邻的两个小孩得到更多的糖果。
需最少准备多少糖果?
样例
给定评级 = [1, 2]
, 返回 3
.
给定评级 = [1, 1, 1]
, 返回 3
.
给定评级 = [1, 2, 2]
, 返回 4
. ([1,2,1]).
基础每个人一颗糖,评级比左相邻大得到的糖++,比右相邻大得到的糖++
那么用一个vector存每个小孩应得的糖果,然后顺序逆序遍历两遍更新这个vector
1 int candy(vector<int> &ratings) { 2 // write your code here 3 vector<int> dp(ratings.size(),1); 4 for(int i=0;i<ratings.size()-1;i++) 5 if(ratings[i]<ratings[i+1]) 6 dp[i+1] = max(dp[i+1],dp[i]+1); 7 8 for(int i=ratings.size()-1;i>=1;i--) 9 if(ratings[i]<ratings[i-1]) 10 dp[i-1] = max(dp[i-1],dp[i]+1); 11 12 return accumulate(dp.begin(),dp.end(),0); 13 }