九章算法之515房屋染色

个人见解,感觉侯老师在这里讲的有一些问题,我把此题以个人的理解将注释写下,欢迎和我有一样的疑惑的同学一起留言讨论。

  1. 房屋染色
    这里有n个房子在一列直线上,现在我们需要给房屋染色,分别有红色蓝色和绿色。每个房屋染不同的颜色费用也不同,你需要设计一种染色方案使得相邻的房屋颜色不同,并且费用最小,返回最小的费用。
    费用通过一个nx3 的矩阵给出,比如cost[0][0]表示房屋0染红色的费用,cost[1][2]表示房屋1染绿色的费用。
    Example
    样例 1:

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

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

class Solution {
public:
    /**
     * @param costs: n x 3 cost matrix
     * @return: An integer, the minimum cost to paint all houses
     * 思想:设f[i][j]:i表示第几个房子,j表示第i个房子染什么色
     */
     //数组输入的放在c里面,所以c[0][]~c[n-1][]代表的就是第1到第n个房子
     //这也解释了为什么:f[i-1][j](前i-1个房子的总价格)+c[i-1][j] 的总价格就等于f[i][j]
     //f[i][j] = f[i-1][k]+c[i-1][j];
    int minCost(vector<vector<int>> &c)//c是输入的二维数组,代表的每一个房子染三种分别的价钱
    {
       int n = c.size();//获得房子数
       
       int f[n+1][3];//用f[1]~f[n]表示的是第1~n个房子,[3]表示的三种颜色
       
       //第0房子不作数,所以初始化为0
       for(int i=0;i<3;i++)
       {
           f[0][i] = 0;
       }
       
      //先给每一个房子分别涂三种颜色初始化为最大值INT_VALUE;
      int i,j,k,res;
      for(i=1;i<=n;i++)
      {
          for(j=0;j<3;j++)
          {
              f[i][j] = INT_MAX;
              for(k=0;k<3;k++)//确定第i-1个房子所涂的颜色
              {
                    if(k == j)
                   continue;
                  //这里很关键,我个人觉得九章算法老师这里讲错了,
                  //f[i-1][k]表示前i-1个房子的总价格,第i-1涂k色的价格+c[i-1][j]表示第i个房子的价格=f[i][j]前i个房子的总共价格,第i个房子涂色为j
                  if(f[i-1][k]+c[i-1][j] <f[i][j])
                  {
                      f[i][j] = f[i-1][k]+c[i-1][j];
                  }
              }
          }
      }
      res = f[n][0];
      if(res > f[n][1])
      {
          res = f[n][1];
      }
      if(res > f[n][2])
      {
          res = f[n][2];
      }
      return res;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_38173631/article/details/105498502