zoukankan      html  css  js  c++  java
  • UVa 103 Stacking Box(记忆化搜索)

    题意:

    有n个箱子,每个箱子有m的维度,箱子a能装到箱子b里面的条件是,存在一个序列,使a的任意一个维度大小小于b。

    求最多能套几层箱子。

    思路:

    简单题。首先对每个箱子的维度从小到大排序,然后根据a和b的关系生成一个有向图无环图,然后进行遍历每个节点最大的值。

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <vector>
    #include <algorithm>
    
    using namespace std;
    
    int n, m;
    int a[35][20];
    vector<int> map[35];
    int dp[35], path[35];
    
    bool judge(int p, int q)
    {
        for (int i = 0; i < m; ++i)
            if (a[p][i] >= a[q][i])
                return false;
        return true;
    }
    
    int dfs(int u)
    {
        if (dp[u])
            return dp[u];
    
        for (int i = 0; i < map[u].size(); ++i)
        {
            int v = map[u][i];
            int t = dfs(v) + 1;
            if (dp[u] < t)
                dp[u] = t, path[u] = v;
        }
        return dp[u];
    }
    
    int main()
    {
        while (scanf("%d %d", &n, &m) != EOF)
        {
            for (int i = 1; i <= n; ++i)
            {
                for (int j = 0; j < m; ++j)
                    scanf("%d", &a[i][j]);
                sort(a[i], a[i] + m);
                map[i].clear();
            }
    
            for (int i = 1; i <= n; ++i)
                for (int j = 1; j <= n; ++j)
                    if (judge(i, j))
                        map[i].push_back(j);
            
            int ans = 0;
            memset(dp, 0, sizeof(dp));
            int id;
            for (int i = 1; i <= n; ++i)
            {
                int temp = dfs(i);
                if (ans < temp)
                    ans = temp, id = i;
            }
            printf("%d\n", ans + 1);
            printf("%d", id);
            for (int i = 0; i < ans; ++i)
                id = path[id], printf(" %d", id);
            printf("\n");
        }
        return 0;
    }
    -------------------------------------------------------

    kedebug

    Department of Computer Science and Engineering,

    Shanghai Jiao Tong University

    E-mail: kedebug0@gmail.com

    GitHub: http://github.com/kedebug

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

  • 相关阅读:
    PE文件解析器的编写(二)——PE文件头的解析
    PE解析器的编写(一)——总体说明
    PE文件详解(九)
    PE文件详解(八)
    06_建造者模式
    05_模板方法模式
    04_抽象工厂模式
    03_简单工厂模式(静态工厂模式)
    02_工厂方法模式
    01_单例模式
  • 原文地址:https://www.cnblogs.com/kedebug/p/2764918.html
Copyright © 2011-2022 走看看