135. Candy(dp)
2017-11-11 13:35
148 查看
https://leetcode.com/problems/candy/discuss/
题目:一队小朋友排成行,并且分出等级,每个小朋友至少要有一块糖,且如果一个小朋友的等级高于左边或者右边的小朋友,那它的糖就要比他们多。 求最少需要多少块糖可以满足这种要求。
思路:可以先给每个小朋友分一块糖,然后从前往后遍历一次,确保每个人如果等级比前一个人高,那么所得的糖果数就是前一个人的基础上再加1个。 但是这样还不能满足要求,因为有可能排在身后且等级更低的那一个人糖果数不少于自己。 其实这种情况很容易就可以解决了,只要从后往前在遍历一次,类似从前往后遍历,从后往前就要确保在排在前面一个而且等级更高的那个小朋友得到的糖果比当前这个位置的糖果数多1.
这样两次遍历以后就可以得出每个小朋友的糖果数了,最后只需要把每个小朋友的糖果数全部加起来就可以得到最小需要的糖果总数了。时间复杂度为O(n)。
题目:一队小朋友排成行,并且分出等级,每个小朋友至少要有一块糖,且如果一个小朋友的等级高于左边或者右边的小朋友,那它的糖就要比他们多。 求最少需要多少块糖可以满足这种要求。
思路:可以先给每个小朋友分一块糖,然后从前往后遍历一次,确保每个人如果等级比前一个人高,那么所得的糖果数就是前一个人的基础上再加1个。 但是这样还不能满足要求,因为有可能排在身后且等级更低的那一个人糖果数不少于自己。 其实这种情况很容易就可以解决了,只要从后往前在遍历一次,类似从前往后遍历,从后往前就要确保在排在前面一个而且等级更高的那个小朋友得到的糖果比当前这个位置的糖果数多1.
这样两次遍历以后就可以得出每个小朋友的糖果数了,最后只需要把每个小朋友的糖果数全部加起来就可以得到最小需要的糖果总数了。时间复杂度为O(n)。
class Solution { public: int candy(vector<int>& ratings) { int len=ratings.size(),a=0; int dp[len]; dp[0]=1; for(int x=1;x<len;x++) dp[x]=ratings[x]>ratings[x-1]?dp[x-1]+1:1; for(int x=len-2;x>=0;x--) dp[x]=ratings[x]>ratings[x+1]?max(dp[x+1]+1,dp[x]):dp[x]; for(int x=0;x<len;x++) a+=dp[x]; return a; } };
相关文章推荐
- HLJU_DP解题报告
- Codeforces 354 B Pyramid of Glasses (dp)
- hdu 1260 Tickets(DP)
- Codeforces 426E Sereja and Two Sequences【思维+Dp+二分】好题!
- 【NOIP模拟题】【DP】【同余最短路】【暴力剪枝】2016.11.15 第二题 小L的牛栏 题解
- HDU 4734 F(x)(数位DP)
- LS 21 Packing(DP)
- light oj 1073 状态压缩dp+输出字典序最小的解
- 河南省第六届省赛 探寻宝藏 dp
- hdu 3247(ac自动机+状态压缩dp+最短路)
- UVA 1371 - Period(DP)
- 高效面试之动态规划DP
- HDU2412 Party at Hali-Bula(树形DP)
- LA 3637 - The Bookcase(DP)
- 【bzoj2476】战场的数目 矩阵乘法优化dp
- 51nod 1464 半回文(dp,Trie)
- 电视游戏问题(捆绑DP)
- BZOJ 4831 [DP]
- ZOJ 1463 POJ 1141 Brackets Sequence (区间DP) #by Plato
- HDU 4123 Bob’s Race(树形DP,rmq)