我正在解决这个问题
有一排房屋,每栋房屋都可以涂上红色,蓝色和绿色三种颜色。用一定颜色绘制每个房子的成本是不同的。你必须为所有的房屋涂漆,使两个相邻的房屋没有相同的颜色。你必须以最低的成本为房屋涂漆。你会怎么做?
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;
}
}
我因半个案件而失败......
答案 0 :(得分:2)
你可以使用动态编程:
让F(l,c)
成为第一个l
房屋中最便宜的画作,最后一栋房屋的颜色为c
设w(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)