最近小明搬到了新家,他正在粉刷墙壁,但是不幸的是他粉刷的墙壁并不理想。他的墙壁是一个长度为 
的格子,每个格子用0表示红色,用1表示蓝色。现在墙壁是一个非常混乱的颜色。他想将墙壁涂成左边全是蓝色右边全是红色,可以将墙壁刷成全是红色或者蓝色。请问他至少需要粉刷多少个格子墙壁刷成他想要的样子? 
   数据范围:
 
   进阶:时间复杂度
,空间复杂度%5C)
  
                                        第一行一个整数。
第二行个长度为的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));
    }
}