zoukankan      html  css  js  c++  java
  • Leetcode: Paint House

    There are a row of n houses, each house can be painted with one of the three colors: red, blue or green. The cost of painting each house with a certain color is different. You have to paint all the houses such that no two adjacent houses have the same color.
    
    The cost of painting each house with a certain color is represented by a n x 3 cost matrix. For example, costs[0][0] is the cost of painting house 0 with color red; costs[1][2] is the cost of painting house 1 with color green, and so on... Find the minimum cost to paint all houses.
    
    Note:
    All costs are positive integers.
    
    Show Company Tags
    Show Tags
    Show Similar Problems

     The same with F面经

     1 public class Solution {
     2     public int minCost(int[][] costs) {
     3         if (costs==null || costs.length==0 || costs[0].length==0) return 0;
     4         int n = costs.length;
     5         int c = costs[0].length;
     6         int[][] res = new int[n][c];
     7 
     8         for (int j=0; j<c; j++) {
     9             res[0][j] = costs[0][j];
    10         }
    11         for (int i=1; i<n; i++) {
    12             for (int j=0; j<c; j++) {
    13                 res[i][j] = Integer.MAX_VALUE;
    14                 for (int k=0; k<c; k++) {
    15                     res[i][j] = (k==j)? res[i][j] : Math.min(res[i][j], res[i-1][k]+costs[i][j]);
    16                 }
    17             }
    18         }
    19         int result = Integer.MAX_VALUE;
    20         for (int j=0; j<c; j++) {
    21             result = Math.min(result, res[n-1][j]);
    22         }
    23         return result;
    24     }
    25 }

    Better Solution: O(N) time, O(1) space

     1 public class Solution {
     2     public int minCost(int[][] costs) {
     3         if(costs != null && costs.length == 0) return 0;
     4         for(int i = 1; i < costs.length; i++){
     5             // 涂第一种颜色的话,上一个房子就不能涂第一种颜色,这样我们要在上一个房子的第二和第三个颜色的最小开销中找最小的那个加上
     6             costs[i][0] = costs[i][0] + Math.min(costs[i - 1][1], costs[i - 1][2]);
     7             // 涂第二或者第三种颜色同理
     8             costs[i][1] = costs[i][1] + Math.min(costs[i - 1][0], costs[i - 1][2]);
     9             costs[i][2] = costs[i][2] + Math.min(costs[i - 1][0], costs[i - 1][1]);
    10         }
    11         // 返回涂三种颜色中开销最小的那个
    12         return Math.min(costs[costs.length - 1][0], Math.min(costs[costs.length - 1][1], costs[costs.length - 1][2]));
    13     }
    14 }
  • 相关阅读:
    UVA
    UVA
    模板——扩展欧几里得算法(求ax+by=gcd的解)
    UVA
    模板——2.2 素数筛选和合数分解
    模板——素数筛选
    Educational Codeforces Round 46 (Rated for Div. 2)
    Educational Codeforces Round 46 (Rated for Div. 2) E. We Need More Bosses
    Educational Codeforces Round 46 (Rated for Div. 2) D. Yet Another Problem On a Subsequence
    Educational Codeforces Round 46 (Rated for Div. 2) C. Covered Points Count
  • 原文地址:https://www.cnblogs.com/EdwardLiu/p/5063170.html
Copyright © 2011-2022 走看看