最近小明搬到了新家,他正在粉刷墙壁,但是不幸的是他粉刷的墙壁并不理想。他的墙壁是一个长度为 的格子,每个格子用0表示红色,用1表示蓝色。现在墙壁是一个非常混乱的颜色。他想将墙壁涂成左边全是蓝色右边全是红色,可以将墙壁刷成全是红色或者蓝色。请问他至少需要粉刷多少个格子墙壁刷成他想要的样子?
数据范围:
进阶:时间复杂度,空间复杂度
第一行一个整数。
第二行个长度为的01串,0表示红色,1表示蓝色。
输出一个整数表示最少粉刷次数。
3 001
1
只需要将最后一个刷成红色。
JAVA 两个最简单的【动态规划】
import java.util.*; import java.io.*; public class Main{ int paint(int length, int[] array){ int[] dp = new int[length], min = new int[length+1]; dp[0] = array[0]; for(int i = 1 ; i<length ; i++) dp[i] = dp[i-1] + array[i]; min[0] = dp[length - 1]; //左边留0个墙面刷蓝,右边剩余所有墙面刷红(即1的个数) for(int i = 1 ; i<=length ; i++) min[i] = Math.min(min[i-1], (i - dp[i-1]) + (dp[length-1] - dp[i-1])); return min[length]; } // 单纯处理输入数据,不用看 public static void main(String[] args) throws IOException{ Main main = new Main(); BufferedReader buf = new BufferedReader(new InputStreamReader(System.in)); int i = 0, len = Integer.parseInt(buf.readLine()); int[] ar = new int[len]; for(char c : buf.readLine().toCharArray()){ ar[i] = c - '0'; i++; } System.out.println(main.paint(len, ar)); } }