3房屋和最低的绘画成本

时间:2014-07-09 05:43:25

标签: java algorithm

我正在解决这个问题

有一排房屋,每栋房屋都可以涂上红色,蓝色和绿色三种颜色。用一定颜色绘制每个房子的成本是不同的。你必须为所有的房屋涂漆,使两个相邻的房屋没有相同的颜色。你必须以最低的成本为房屋涂漆。你会怎么做?

import java.io.*;

import java.util.Scanner;
public class Solution { 
    static public int [][]v = new int[100][3];
    static public  int [][] dp = new int[100][3];

    public static void main(String args[] ) throws Exception {
        Scanner in = new Scanner(System.in);
        int n = in.nextInt();
        for (int i = 1; i <= n; ++i) {
            v[i][0] = in.nextInt();
        }
        for (int i = 1; i <= n; ++i) {
            v[i][1] = in.nextInt() ;
        }
        for (int i = 1; i <= n; ++i) {
            v[i][2] = in.nextInt();
        } 
        System.out.println( min_cost(n));
    }

    public static int min(int a, int b) {
        if (a <= b) {
            return a;
        }
        return b;
    }

    public static   int min(int a, int b, int c) {
        return min(min(a, b), c);
    } 

    public static int min_cost(int n) { 
        dp[1][0] = v[1][0];
        dp[1][1] = v[1][1];
        dp[1][2] = v[1][2];
        for (int i = 2; i <= n; ++i) {
            dp[i][0] = min(dp[i - 1][1], dp[i - 1][2]) + v[i][0];
            dp[i][1] = min(dp[i - 1][0], dp[i - 1][2]) + v[i][1];
            dp[i][2] = min(dp[i - 1][1], dp[i - 1][0]) + v[i][2];
        }

        int result = min(dp[n][0], dp[n][1], dp[n][2]);
        return result;
    } 
}

我因半个案件而失败......

1 个答案:

答案 0 :(得分:2)

你可以使用动态编程:

F(l,c)成为第一个l房屋中最便宜的画作,最后一栋房屋的颜色为cw(k,c)k - c

然后

所有F(0,c) = 0

c in colors

递归F

F(k,c) = min( F(k-1,cc) + w(k,c) : cc in colors and cc!=c )

答案:

min( F(l,cc) : cc in colors)