zoukankan      html  css  js  c++  java
  • 房屋染色

    房屋染色

    题目:
    这里有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

    解题思路:首先想最后一个房屋应该涂什么颜色最便宜,确定了最后一个房子的颜色后要思考倒数第二个房子的颜色,以此类推这是一个重复子问题,但是确定当前房子时需要知道之前的房子是什么颜色,所以需要多开一维数组来对颜色进行记录

    public class Solution {
        /**
         * @param costs: n x 3 cost matrix
         * @return: An integer, the minimum cost to paint all houses
         */
        public int minCost(int[][] costs) {
            //数组定义:dp[i][j]表示第i栋房子涂j种涂料时的最小花费
            int dp[][] = new int[costs.length + 1][3];
            
            //初始化
            dp[0][0] = 0;
            dp[0][1] = 0;
            dp[0][2] = 0;
            
            /**
            状态方程 dp[i][j] = min(dp[i - 1][0..2] + costs[i][j])
            **/
            
            for(int i = 1; i <= costs.length; i++) {
                for(int j = 0; j < 3; j++) {
                    for(int k = 0; k < 3; k++) {
                        if(k == j) continue;
                        if(dp[i][j] != 0)
                            dp[i][j] = Math.min(dp[i - 1][k] + costs[i - 1][j], dp[i][j]);
                            
                        else {
                            dp[i][j] = dp[i - 1][k] + costs[i - 1][j];
                        }
                    }
                }
            }
            
            return Math.min(dp[costs.length][0], Math.min(dp[costs.length][1],dp[costs.length][2]));
        }
    }
    
  • 相关阅读:
    猜数字游戏,猜三次都不对,则结束游戏,猜一次就成功,结束游戏
    用return关键字实现1——100累加求和,返回总和并接收输出
    用return关键字实现求和操作
    return关键字的作用和接受实验
    数组各元素随机赋值、求和、求平均值、求最大值的各类测试(一维数组)
    日期下拉选择
    22--
    css 17课--
    css盒模型
    css学习
  • 原文地址:https://www.cnblogs.com/katoMegumi/p/13962915.html
Copyright © 2011-2022 走看看