学渣带你刷Leetcode256. 粉刷房子

题目描述

假如有一排房子,共 n 个,每个房子可以被粉刷成红色、蓝色或者绿色这三种颜色中的一种,你需要粉刷所有的房子并且使其相邻的两个房子颜色不能相同。

当然,因为市场上不同颜色油漆的价格不同,所以房子粉刷成不同颜色的花费成本也是不同的。每个房子粉刷成不同颜色的花费是以一个 n x 3 的矩阵来表示的。

例如,costs[0][0] 表示第 0 号房子粉刷成红色的成本花费;costs[1][2] 表示第 1 号房子粉刷成绿色的花费,以此类推。请你计算出粉刷完所有房子最少的花费成本。

注意:

所有花费均为正整数。

示例:

输入: [[17,2,17],[16,16,5],[14,3,19]]
输出: 10
解释: 将 0 号房子粉刷成蓝色,1 号房子粉刷成绿色,2 号房子粉刷成蓝色。
     最少花费: 2 + 5 + 3 = 10。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/paint-house
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

白话题目:
 

想鱼和熊掌都兼得。鱼就是(价格最少)熊掌就是(相邻各自颜色不同)

算法:

动态规划

动态规划思想, 遍历每个房子。 每个房子都算下到当前时,选红 蓝 绿三种颜色的最小值
new_red = costs[i][0] + MIN(min_blue, min_green);  //这块要是选红色的,之前的就得是蓝色或者绿色
new_blue = costs[i][1] + MIN(min_red, min_green);//同理
new_green = costs[i][2] + MIN(min_red, min_blue);//同理

--------------------------------------------------------------------------

每一行如果选择这个颜色后会怎么样啊,

你这一行的选择后对整个的影响都和之前有关,最后我们要的就是总体上最小的那个数

详细解释关注 B站  【C语言全代码】学渣带你刷Leetcode 不走丢 https://www.bilibili.com/video/BV1C7411y7gB

C语言完全代码

#include <stdio.h>
#include <stdlib.h>

#define MIN(a,b) ((a)<(b)?(a):(b))

int minCost(int** costs, int costsSize, int* costsColSize){
    int min_red=0, min_blue=0, min_green=0;
    int i, new_red, new_blue, new_green;


    for (i = 0; i < costsSize; i++){
        new_red = costs[i][0] + MIN(min_blue, min_green);
        new_blue = costs[i][1] + MIN(min_red, min_green);
        new_green = costs[i][2] + MIN(min_red, min_blue);
        min_red = new_red;
        min_blue = new_blue;
        min_green = new_green;
    }
    return MIN(MIN(min_red, min_blue), min_green);
}

int main()
{
    int costsSize;//m
    int costsColSize;//n
    printf("输入m*n大小,例如 (3 3)");
    scanf("%d %d",&costsSize,&costsColSize);
    printf("输入矩阵,例如 (17 2 17  ;  16 16 5  ;   14 3 19 )\n");
    int** costs=(int**)malloc(sizeof(int*)*costsSize);
    int m,n;
    for ( m = 0; m < costsSize; m ++)
    {
        costs[m]=(int*)malloc(sizeof(int)*costsColSize);
        for ( n = 0; n< costsColSize; n ++)
        {
            scanf("%d",&costs[m][n]);
        }
    }


    int result=minCost(costs, costsSize, costsColSize);
    printf("%d\n",result);
    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值