美文网首页
动态规划&回溯算法

动态规划&回溯算法

作者: 涵仔睡觉 | 来源:发表于2018-03-23 15:28 被阅读0次

题目:

有个穷困的艺术家。他画了一幅超现实主义的作品《方块手拉手》。现在他已经把图画中手拉手的一排大小不一的方块都画出来了。现在要考虑上颜色了。可惜他手中的钱并不多了。但是他是个有追求的人,他希望这幅画中每两个相邻的方块的颜色是不一样的。你能帮他计算一下把这幅画上色后,最少需要花多少钱么。

输入 N个方块,K个颜色

接下来每列是各个方块染成不同颜色的价钱

输出 最少花的钱

例:
输入:
4 3
2 3 2
9 1 4
7 8 1
2 8 3
输出:
6

// 动态规划
#include <iostream>
#include <vector>

using namespace std;

int minCost(vector<vector<int> >& cost) {
    int N = cost.size();
    int K = cost[0].size();
    vector<vector<int> > res(N, vector<int>(K, 0));
    for (int i = 0; i < K; ++i) {
        res[0][i] = cost[0][i];
    }

    for (int i = 1; i < N; ++i) {
        for (int j = 0; j < K; ++j) {
            int min = INT_MAX;
            for (int k = 0; k < K; ++k) {
                if ((k != j) && res[i-1][k] < min) min = res[i-1][k];
            }
            res[i][j] = cost[i][j] + min;
        }
    }

    int min = INT_MAX;
    for (int i = 0; i < K; ++i) {
        if (res[N-1][i] < min) min = res[N-1][i];
    }

    return min;
}

int main() {
    int N, K;
    cin >> N >> K;
    vector<vector<int> > cost;

    while(N--) {
        vector<int> tmp;
        int a;
        int k = K;
        while (k--) {
            cin >> a;
            tmp.push_back(a);
        }
        cost.push_back(tmp);
    }

    cout << minCost(cost) << endl;
    return 0;
}

// 回溯算法
#include <iostream>
#include <vector>

using namespace std;

int ans = INT_MAX;

bool isNotNear(int i, int depth, vector<int>& path) {
    if (depth != 0 && i == path[depth - 1]) return false;
    return true;
}

void minCostCore(vector<vector<int> >& cost, int depth, int sum, vector<int> path) {
    if (depth == cost.size()) {
        if(ans > sum) ans = sum;
        return;
    }

    for (int i = 0; i < cost[0].size(); ++i) {
        path[depth] = cost[depth][i];
        if (isNotNear(i, depth, path)) {
            minCostCore(cost, depth+1, sum+cost[depth][i], path);
        }
        path[depth] = -1;
    }
}

int minCost(vector<vector<int> >& cost) {
    int N = cost.size();
    int K = cost[0].size();
    vector<int> path(cost.size(), -1);
    minCostCore(cost, 0, 0, path);
    return ans;
}

int main() {
    int N, K;
    cin >> N >> K;
    vector<vector<int> > cost;

    while(N--) {
        vector<int> tmp;
        int a;
        int k = K;
        while (k--) {
            cin >> a;
            tmp.push_back(a);
        }
        cost.push_back(tmp);
    }

    cout << minCost(cost) << endl;
    return 0;
}

相关文章

  • 动态规划&回溯算法

    题目: 有个穷困的艺术家。他画了一幅超现实主义的作品《方块手拉手》。现在他已经把图画中手拉手的一排大小不一的方块都...

  • 动态规划介绍

    动态规划 动态规划介绍   动态规划比较适合用来求解最优问题,比如求最大值、最小值等等; 与回溯算法相同的是都会分...

  • 初识动态规划

    0-1 背包问题 备忘录 动态规划-二维数组 动态规划-一维数组 0-1 背包问题升级版 回溯算法 动态规划-二维...

  • 高级算法设计与分析

    目录 算法基础 算法复杂性 递归与分治 回溯法与分支限界法 贪心算法 动态规划法 NP问题 概率算法 现代优化算法...

  • 动态规划理论与案例

    一、为什么要使用动态规划 在前面的文章中,我们介绍了贪心算法、回溯算法,它们和动态规划一样,通常都可以用来解决多阶...

  • 2018暑假留校计划

    1. leetcode 中级算法 (动态规划必须全部做完,回溯算法,树和图看具体做的情况 ) 2. 操作系统 ...

  • 一位算法工程师的自我修养

    数据结构与算法 基本算法思想动态规划贪心算法回溯算法分治算法枚举算法 算法基础 时间复杂度 空间复杂度 最大复杂度...

  • 数据结构与算法简述(下)

    目录: 算法简介 排序算法 递归与穷举 贪心与分治 动态规划和回溯 1.算法简介 解题方案的准确而完整的描述,是一...

  • 五大常用算法

    引言 据说有人归纳了计算机的五大常用算法,它们是贪婪算法,动态规划算法,分治算法,回溯算法以及分支限界算法。虽然不...

  • 4. 动态规划算法

    1. 动态规划算法总结2. 漫画:什么是动态规划?3.算法之动态规划4. 动态规划-算法

网友评论

      本文标题:动态规划&回溯算法

      本文链接:https://www.haomeiwen.com/subject/scrxcftx.html