【LC】2712. 使所有字符相等的最小成本【DP|思维】

发布时间 2023-06-03 11:18:36作者: TimusGo

Link

题意

见题链。

思路

赛后看了一眼这个题解,自己写出来了。赛中没有写出来

代码

package main

func minimumCost(s string) int64 {
	n := len(s)
	dp1 := make([][]int64, n+1)
	for i := range dp1 {
		dp1[i] = make([]int64, 2)
	}
	dp2 := make([][]int64, n+1)
	for i := range dp2 {
		dp2[i] = make([]int64, 2)
	}
	lastOneIdx, lastZeroIdx := -1, -1
	for i := 0; i < n; i++ {
		if s[i] == '1' {
			dp1[i+1][1] = dp1[i][1]
			dp1[i+1][0] = dp1[lastZeroIdx+1][1] + int64(i+1)
			lastOneIdx = i
		} else {
			dp1[i+1][0] = dp1[i][0]
			dp1[i+1][1] = dp1[lastOneIdx+1][0] + int64(i+1)
			lastZeroIdx = i
		}
	}
	lastOneIdx, lastZeroIdx = n, n
	for i := n - 1; i >= 0; i-- {
		if s[i] == '1' {
			dp2[i][1] = dp2[i+1][1]
			dp2[i][0] = dp2[lastZeroIdx][1] + int64(n-i)
			lastOneIdx = i
		} else {
			dp2[i][0] = dp2[i+1][0]
			dp2[i][1] = dp2[lastOneIdx][0] + int64(n-i)
			lastZeroIdx = i
		}
	}
	ans := int64(2e18)
	for i := 0; i < n; i++ {
		ans = min(ans, dp1[i+1][0]+dp2[i+1][0])
		ans = min(ans, dp1[i+1][1]+dp2[i+1][1])
	}
	return ans
}

func min(a, b int64) int64 {
	if a < b {
		return a
	}
	return b
}