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 } }