LeetCode--256. 粉刷房子(动态规划)

粉刷房子(动态规划)

1. 题目描述

难度:简单
在这里插入图片描述

2. 题目分析

这道题目是一道典型的动态规划问题,如果我们只把目光放在一个最少花费的身上,状态转化方程并不容易想出来,但是如果我们着眼于每一个颜色的最少花费,那么状态转化方程可以很容易地写成:

  • 初始态
red[0] = costs[0][0]
blue[0] = costs[0][0]
green[0] = costs[0][0]
  • 过程
red[i] = Min(blue[i-1], green[i-1]) + costs[i][0]
blue[i] = Min(red[i-1], green[i-1]) + costs[i][1]
green[i] = Min(red[i-1], blue[i-1]) + costs[i][2]
  • 结果:
result = Min(red[n-1], blue[n-1], green[n-1])

时间复杂度为O(n).

3. C语言实现

代码如下:

int Min(int a, int b){
    return a<b?a:b;
}
int minCost(int** costs, int costsSize, int* costsColSize){
    int n = costsSize;
    if(n == 0) return 0;
    int res;
    // 申请三个内存空间用来存放每个颜色的最小花费
    int* red = (int *)malloc(sizeof(int)*n);
    int* blue = (int *)malloc(sizeof(int)*n);
    int* green = (int *)malloc(sizeof(int)*n);
    // 初始化
    red[0] = costs[0][0];
    blue[0] = costs[0][1];
    green[0] = costs[0][2];
    for(int i = 1; i < n; i++){
        red[i] = Min(blue[i-1], green[i-1]) + costs[i][0];
        blue[i] = Min(red[i-1], green[i-1]) + costs[i][1];
        green[i] = Min(red[i-1], blue[i-1]) + costs[i][2];
    }
    res = Min(Min(red[n-1], blue[n-1]), green[n-1]);
    // 释放数组内存空间
    free(red);
    free(green);
    free(blue);
    return res;
}
发布了175 篇原创文章 · 获赞 237 · 访问量 12万+

猜你喜欢

转载自blog.csdn.net/qq_42580947/article/details/105281598