Leetcode: Candy
There areNChildren 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?
Address: https://oj.leetcode.com/problems/candy/
Algorithm: this problem can be solved by Dynamic Planning, before the exercise in the King of the have met, analysis see my previous article: http://www.cnblogs.com/boostable/p/online_judge_1470_1549_1493_1550.html
Code:
1 class Solution { 2 public: 3 int candy(vector<int> &ratings) { 4 int n = ratings.size(); 5 vector<int> num_candys(n); 6 if(n == 0) 7 return 0; 8 return subSolution(0,n-1,num_candys,ratings); 9 }10 int subSolution(int s, int e, vector<int> &num_candys,vector<int> &ratings){11 if(s == e){12 num_candys[s] = 1;13 return 1;14 }else{15 int total = 0;16 int mid = (s + e) >> 1;17 int left = subSolution(s,mid,num_candys,ratings);18 int right = subSolution(mid+1,e,num_candys,ratings);19 if(ratings[mid] == ratings[mid+1]){20 return left + right;21 }else if(ratings[mid] > ratings[mid+1]){22 if(num_candys[mid] > num_candys[mid+1])23 return left + right;24 else{25 total += (num_candys[mid+1] + 1 - num_candys[mid]);26 num_candys[mid] = num_candys[mid+1] + 1;27 int totalAdd = 0;28 for(int i = mid-1; i >= s; --i){29 if(ratings[i] <= ratings[i+1] || (ratings[i] > ratings[i+1] && num_candys[i] > num_candys[i+1]))30 break;31 else{32 total += (num_candys[i+1] + 1 - num_candys[i]);33 num_candys[i] = num_candys[i+1] + 1;34 }35 }36 return left + right + total;37 }38 }else{39 if(num_candys[mid] < num_candys[mid+1])40 return left + right;41 else{42 total += (num_candys[mid] + 1 - num_candys[mid+1]);43 num_candys[mid+1] = num_candys[mid] + 1;44 for(int i = mid+2; i <= e; ++i){45 if(ratings[i] <= ratings[i-1] || (ratings[i] > ratings[i-1] && num_candys[i] > num_candys[i-1]))46 break;47 else{48 total += (num_candys[i-1] + 1 - num_candys[i]);49 num_candys[i] = num_candys[i-1] + 1;50 }51 }52 return left + right + total;53 }54 }55 }56 }57 };
Leetcode: Candy