动态规划之糖果分配
2017-11-28 15:28
218 查看
candy糖果分配
有N个孩子站成一行,每个孩子有不同的评估值。
分配糖果给这些孩子,受到如下条件的限制:
1. 每个孩子必须至少有一颗糖果
2. 有更高评估值的孩子比他的邻居有更多的糖果
问:必须分配的最少糖果是多少。
找最大最小值,这种问题叫做寻优问题,也叫做规划问题。
分析:
1. dp[i]:表示0-i的最少糖果,val[i]:表示i的评估值,c[i]:表示i的糖果
2. dp[i+1]=⎧⎩⎨dp[i]+1,dp[i]+val[i]+1,val[i+1] <= valval[i+1] >val
3. 2步骤可能出现dp[i]==dp[i+1]==1,需要从右往左进行运算
使得,c[i-1] = c[i-1]+1,if val[i-1] > val[i]
操作过程:
1. 从左向右扫描后能保证比左边邻居大1
2. 从右向左扫描后能保证比右边邻居大1
有N个孩子站成一行,每个孩子有不同的评估值。
分配糖果给这些孩子,受到如下条件的限制:
1. 每个孩子必须至少有一颗糖果
2. 有更高评估值的孩子比他的邻居有更多的糖果
问:必须分配的最少糖果是多少。
找最大最小值,这种问题叫做寻优问题,也叫做规划问题。
分析:
1. dp[i]:表示0-i的最少糖果,val[i]:表示i的评估值,c[i]:表示i的糖果
2. dp[i+1]=⎧⎩⎨dp[i]+1,dp[i]+val[i]+1,val[i+1] <= valval[i+1] >val
3. 2步骤可能出现dp[i]==dp[i+1]==1,需要从右往左进行运算
使得,c[i-1] = c[i-1]+1,if val[i-1] > val[i]
操作过程:
1. 从左向右扫描后能保证比左边邻居大1
2. 从右向左扫描后能保证比右边邻居大1
int candy(vector<int> &ratings) { int n = ratings.size(); vector<int> v(n,1); for( int i = 1;i < n;i++) if(ratings[i]>ratings[i-1]) v[i] = v[i-1]+1; int sum = 0; for( int i = n-1;i > 0;i--){ if(ratings[i-1]>ratings[i]&&v[i-1]<=v[i]) v[i-1] = v[i] + 1; sum += v[i]; } sum += v[0]; return sum; }
相关文章推荐
- Candy 分配糖果
- [各种面试题] 分配糖果
- ACM-动态规划5-吃糖果
- 多退少补1:分配最少糖果数
- 欢乐暑假线上编程比赛第四题:分配糖果
- |Tyvj|动态规划|P1203 机器分配
- |NOIOJ|动态规划|2989:糖果
- 【动态规划】分配小组
- 分配糖果问题——Leetcode系列(十五)
- 蓝桥杯 ADV-205算法提高 拿糖果(动态规划)
- 【动态规划】【RQ140】分配时间
- 欢乐暑假线上编程比赛第四题:分配糖果
- 编码-京东实习笔试编程题-糖果问题-动态规划
- 动态规划练习05:吃糖果
- OpenJudge - 2989 糖果 动态规划(DP) 重庆一中高2018级竞赛班第十一次测试 2016.9.24 Problem 2
- 【动态规划】第四题 分配小组(poset.pas/c/cpp)
- 动态规划求解资源最优分配问题
- Python实现的基于优先等级分配糖果问题算法示例
- 淘宝流量分配(动态规划)
- 编程挑战高校俱乐部分配糖果答案