侧边栏
首页代码

房屋染色

这里有n个房子在一列直线上,现在我们需要给房屋染色,分别有红色蓝色和绿色。每个房屋染不同的颜色费用也不同,你需要设计一种染色方案使得相邻的房屋颜色不同,并且费用最小,返回最小的费用。

费用通过一个nx3 的矩阵给出,比如cost[0][0]表示房屋0染红色的费用,cost[1][2]表示房屋1染绿色的费用。

样例
样例 1:

输入: [[14,2,11],[11,14,5],[14,3,10]]
输出: 10
解释: 第一个屋子染蓝色,第二个染绿色,第三个染蓝色,最小花费:2 + 5 + 3 = 10.
样例 2:

输入: [[1,2,3],[1,4,6]]
输出: 3
注意事项
所有费用都是正整数

序列型dp f[0][1 ..3]代表第0个房子刷成不同的三种颜色的最小费用

class Solution {
public:
    /**
     * @param costs: n x 3 cost matrix
     * @return: An integer, the minimum cost to paint all houses
     */
    int minCost(vector<vector<int>> &costs) {
        // write your code here
        int n = costs.size();
        int f[100000][3];
        f[0][0] = f[0][1] = f[0][2] = 0;
        for(int i = 1;i <= n;i++)
        {
            f[i][0] = f[i][1] = f[i][2] = 1e9+7;
            for(int j = 0;j < 3;j++)
            {
                for(int k = 0;k < 3;k++)
                {
                    if(k == j)
                        continue;
                    if(f[i][j] > f[i - 1][k] + costs[i - 1][j])
                        f[i][j] = f[i - 1][k] + costs[i - 1][j];
                }
            }
        }
        int m = 1e9 + 7;
        for(int i = 0;i < 3;i++)
        {
            m = min(m, f[n][i]); 
        }
        return m;
    }
};
posted @ 2021-02-25 16:23  AlexStraightUp  阅读(61)  评论(0)    收藏  举报
页脚HTML代码