【LeetCode每日一题】[中等]LCP 19. 秋叶收藏集

【LeetCode每日一题】[中等]LCP 19. 秋叶收藏集

LCP 19. 秋叶收藏集

题目来源
算法思想:动态规划
题目:
在这里插入图片描述

思路来源
一共n片树叶,第i片可能为r,也可能为y,前i片最终要和后面的树叶连起来,组合ryr模式,因此需要总结出前i片什么样的模式才能与后面的树叶结合起来共同组成ryr模式。

  1. r模式,即全为r,后面跟yr即可组成ryr模式。
  2. ry模式,后面跟r即可组成ryr模式。
  3. ryr模式,后面跟r即可组成ryr模式。

以y开头的模式,全不符合。
所以前i片树叶组成的模式一共3种:r模式,ry模式,ryr模式
那么前i-1片也是这3种模式,每个模式修改树叶数量用变量r,ry,ryr记录

第i片树叶为r的情况下:

  1. r模式,r模式可以由前i-1片的r模式跟第i片直接组成,无需修改,修改数量跟之前相同为r
  2. ry模式,将本片树叶修改为y,与前i-1片树叶的r模式或者ry模式组合均可,取两者中比较小的:min(r, ry) + 1
  3. ryr模式,与前i-1片树叶的ry模式或者ryr模式直接组合即可,无需修改,取两者中比较小的:min(ry, ryr)
    第i片树叶为y的情况下:
    1. r模式,r + 1
    2. ry模式,min(r, ry)
    3. ryr模式,min(ry, ryr) + 1

java代码

class Solution {
    
    
    public int minimumOperations(String leaves) {
    
    
		char[] leavf = leaves.toCharArray();
		//表示i叶片加入之前的三种模式,r,ry,ryr;调整的最小次数
		int r = 0;
		int ry = Integer.MAX_VALUE;
		int ryr = Integer.MAX_VALUE;
		//表示i叶片加入之后的三种模式,r,ry,ryr;调整的最小次数
		int rtemp = 0;
		int rytemp = 0;
		int ryrtemp = 0;
		if (leavf[0] == 'y') {
    
    
			leavf[0] = 'r';
			r = 1;
		}//初始条件,第一个是y,则进行调整r=1,然后更新r,ry,ryr模式数值
        for (int i = 0; i < leavf.length; i++) {
    
    
			if (leavf[i] == 'r') {
    
    //叶片为红色
				//r = r; 红色直接加入.不需要调整
				rytemp = Math.min(r, ry) + 1;//将叶片调换黄色(+1),可以与i-1时的r模式,ry模式结合,两者取最小值
				ryrtemp = Math.min(ry, ryr);//不换色,可以与i-1时的ry模式,ryr模式结合,两者取最小值
				//r = rtemp;
				ry = rytemp;
				ryr = ryrtemp;
			}
			if (leavf[i] == 'y') {
    
    //叶片是黄色
				rtemp = r + 1;//调换颜色(+1),可以与i-1时的r模式结合
				rytemp = Math.min(r, ry);//不换色,可以与i-1时的r模式,ry模式结合,两者取最小值
				ryrtemp = Math.min(ry, ryr) + 1;//调换颜色(+1),可以与i-1时的ry模式,ryr模式结合,两者取最小值
				r = rtemp;
				ry = rytemp;
				ryr = ryrtemp;
			}
		}
        return ryr;
    }
}

猜你喜欢

转载自blog.csdn.net/qq_39457586/article/details/108897297