LeetCode LCP 19. 秋叶收藏集 - Java & Go - 动态规划

LeetCode LCP 19. 秋叶收藏集

LeetCode LCP 19. 秋叶收藏集
在这里插入图片描述

1.算法

  • 算法
    • 1.动态规划
    • 2.最重要调整为 [红 黄 红] 的形式,就记录每片叶子的状态为 [0, 1, 2] 分别对应三个状态,所以动态数组 dp[n][3] 中 dp[x][y] 表示前x片叶子调整到使第x片叶子处于y状态的最小调整次数
    • 3.初始化:dp[i][j] 当 j > i 时,设定为最大值(因为 i < j 时不能达到定义的 j 状态),为了后面转移时取 min 值
      • dp[0][0] = leaves.charAt(0) == ‘y’ ? 1 : 0;
      • dp[0][1] = Integer.MAX_VALUE;
      • dp[0][2] = Integer.MAX_VALUE;
      • dp[1][0] = dp[0][0] + (leaves.charAt(1) == ‘y’ ? 1 : 0);
      • dp[1][1] = Math.min(dp[0][0], dp[0][1]) + (leaves.charAt(1) == ‘r’ ? 1 : 0);
      • dp[1][2] = Integer.MAX_VALUE;
    • 4.状态转移方程:
      • dp[i][0] = dp[i-1][0] + isYellow;,第i片叶子处于0状态时,第i-1片叶子不可能处于1和2状态
      • dp[i][1] = Math.min(dp[i-1][0], dp[i-1][1]) + isRed;,第i片叶子处于1状态时,第i-1片叶子不可能处于2状态
      • dp[i][2] = Math.min(dp[i-1][1], dp[i-1][2]) + isYellow;,第i片叶子处于2状态时,第i-1片叶子不可能处于0状态

2.Java

public int minimumOperations(String leaves) {
    int length = leaves.length();
    int[][] dp = new int[length][3];
    dp[0][0] = leaves.charAt(0) == 'y' ? 1 : 0;
    dp[0][1] = Integer.MAX_VALUE;
    dp[0][2] = Integer.MAX_VALUE;
    dp[1][0] = dp[0][0] + (leaves.charAt(1) == 'y' ? 1 : 0);
    dp[1][1] = Math.min(dp[0][0], dp[0][1]) + (leaves.charAt(1) == 'r' ? 1 : 0);
    dp[1][2] = Integer.MAX_VALUE;
    for (int i = 2; i < length; i++) {
        int isYellow = leaves.charAt(i) == 'y' ? 1 : 0;
        int isRed = leaves.charAt(i) == 'r' ? 1 : 0;
        dp[i][0] = dp[i-1][0] + isYellow;
        dp[i][1] = Math.min(dp[i-1][0], dp[i-1][1]) + isRed;
        dp[i][2] = Math.min(dp[i-1][1], dp[i-1][2]) + isYellow;
    }
    return dp[length-1][2];
}

3.Go

func minimumOperations(leaves string) int {
	n := len(leaves)
	dp := make([][]int, n)
	for i := range dp {
		dp[i] = make([]int, 3)
	}

	if leaves[0] == 'y' { dp[0][0] = 1 } else { dp[0][0] = 0 }
	dp[0][0] = isYellow(leaves[0])
	dp[0][1] = math.MaxInt64
	dp[0][2] = math.MaxInt64
	dp[1][0] = dp[0][0] + isYellow(leaves[1])
	dp[1][1] = min(dp[0][0], dp[0][1]) + isRed(leaves[1])
	dp[1][2] = math.MaxInt64
	for i := 2; i < n; i++ {
		isYellow := isYellow(leaves[i])
		isRed := isRed(leaves[i])
		dp[i][0] = dp[i-1][0] + isYellow
		dp[i][1] = min(dp[i-1][0], dp[i-1][1]) + isRed
		dp[i][2] = min(dp[i-1][1], dp[i-1][2]) + isYellow
	}
	return dp[n-1][2]
}

func min(x, y int) int { if x < y { return x } else { return y } }
func isYellow(c uint8) int { if c == 'y' { return 1 } else { return 0 } }
func isRed(c uint8) int { if c == 'r' { return 1 } else { return 0 } }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值