码迷,mamicode.com
首页 > 其他好文 > 详细

Leetcode 动态规划 Candy

时间:2014-08-29 02:54:17      阅读:228      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   ar   for   div   

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie


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<int> &ratings){
	int n = ratings.size();
	vector<int> 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);
}


Leetcode 动态规划 Candy

标签:style   blog   http   color   os   io   ar   for   div   

原文地址:http://blog.csdn.net/zhengsenlie/article/details/38914365

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!