动态规划本质
你需要通过某个常见(明显)的关键句直接定位当前的问题是否适合采用动态规划
首先,我们要撸一个关键句:
分数高的小朋友比他旁边得分低的小盆友的糖果多
然后我们就能够构建一个状态转移方程
candies[i] = max{candies[i-1], candies[i+1]} + 1
有了状态转移方程,那你岂不是可以...嘿嘿嘿嘿?
我会单独开一个算法实验室-动态规划总结里面去总结遇到的可能的动态规划的套路。
基于状态转移方程实现代码
candies[i] = max{candies[i-1], candies[i+1]} + 1
->candies[i] = max(candies[i-1]+1,candies[i]);
->candies[i]= max(candies[i],candies[i+1]);
然后有:
public int candy (int[] ratings) {
// write code here
int[] candys = new int[ratings.length];
//每人送一个糖
for(int i =0;i<candys.length;i++){
candys[i] = 1;
}
//从如果当前的人的分数大于左手边的人
//给多分的那个人一颗糖
int sum = 0;
for(int i =1;i<ratings.length;i++){
if(ratings[i]>ratings[i-1]){
candys[i] = Math.max(candys[i],candys[i-1]+1);
}
}
//至于为什么方向是length-2~0的方向进行遍历
//只能说从状态方程,cur>cur+1(和右边的分数进行比较)所以是从右到左
//这样做,你能打到一个“消耗最小的糖”的输出
for(int i =ratings.length-2;i>=0;i--){
if(ratings[i]>ratings[i+1]){
candys[i] = Math.max(candys[i],candys[i+1]+1);
}
}
//统计
int sum2 = 0;
for(int i :candys){
sum2 += i;
}
return sum2;
}
原题今日份5/10;