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

•Dynamic Programming 专栏收录该内容
9 篇文章 0 订阅

粉刷房子(动态规划)

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;
}
  • 2
    点赞
  • 0
    评论
  • 0
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

打赏
文章很值,打赏犒劳作者一下
相关推荐
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页

打赏

爱吃骨头的猫、

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值