PaintHouse II

//
// Created by Administrator on 2021/7/27.
//

#ifndef C__TEST01_PAINTHOUSE_HPP
#define C__TEST01_PAINTHOUSE_HPP

#include <vector>
class PaintHouse {
/*有一排n栋房子,每一栋要漆成K种颜色中的一种
 * 任何两栋相邻的房子不能漆成同一种颜色
 * 房子i染成第j种颜色的花费是cost[i][j]
 * 问最少花费多少钱油漆这些房子
 * 输入
 * -N = 3, K = 3
 * -cost = {
 *      {14, 2, 11},
 *      {11, 14, 15},
 *      {14, 3, 10}
 * }
 * */
public:
    PaintHouse(vector<vector<int>> costN);
    int PaintHouseDP(vector<vector<int>> &cost);
private:
    vector<vector<int>> cost;
};

PaintHouse::PaintHouse( vector<vector<int>> costN) :
cost(costN){
    cost.resize(costN.size());
    for(int i; i<costN.size(); ++i){
        cost[i].resize(costN[i].size());
    }
}
int PaintHouse::PaintHouseDP( vector<vector<int>> &cost) {
    if(cost.size() == 0 || cost[0].size() == 0){
        return 0;
    }
    int N = cost.size();
    int K = cost[0].size();

    vector<vector<int>> f(N); //f[i][j]表示第i个房子漆成第j种颜色的最小花费
    for(int i = 0;i < f.size();i++){
        f[i].resize(K);
    }
    f[0][0] = 0;

    int min1 = INT_MAX;
    int j1, j2;
    int min2 = INT_MAX;

    for(int j = 0; j < f[0].size(); ++j){
        f[0][j] = cost[0][j];
    }

    for(int i = 1; i < f.size(); ++i){
        min1 = INT_MAX;
        min2 = INT_MAX;
        j1 = j2 = 0;
        for(int j = 0; j < f[i].size() ;++j){
            if(f[i-1][j] < min1){
                min2 = min1;
                j2 = j1;
                min1 = f[i-1][j];
                j1 = j;
            }else{
                if(f[i-1][j]<min2){
                    min2 = f[i-1][j];
                    j2 = j;
                }
            }
        }
        for (int j = 0; j < f[i].size(); ++j) {
            f[i][j] = INT_MAX;
            if(i>0){
                if(j == j1){
                    f[i][j] = min2 + cost[i][j];
                }else{
                    f[i][j] = min1 + cost[i][j];
                }
            }
        }
    }
    int res = INT_MAX;
    for(int j = 0; j<f[N-1].size(); ++j){
        if(f[N-1][j] < res) res = f[N-1][j];
    }
    return res;
}

#endif //C__TEST01_PAINTHOUSE_HPP

posted @   蘑菇王国大聪明  阅读(32)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示