uva103-Stacking_Boxes

题目链接请戳 这里

解题思路

DAG上的动态规划。现对n个维度排序(感觉有维度的,先排序排序就行了

代码

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define N 40
using namespace std;

bool G[N][N];
int box[N][N], dp[N];
int k, n;
bool first;

bool judge(int x, int y)
{
    bool flag = true;
    for (int i = 0; i < n; i++) if (box[x][i] >= box[y][i]) flag = false;
    return flag;
}

int cal(int i)
{
    int &ans = dp[i];
    if (ans > 0) return ans;
    ans = 1;
    for (int j = 1; j <= k; j++) if (G[i][j])
        ans = max(ans, cal(j) + 1);
    return ans;
}

void print_ans(int i)
{
    if (first) { printf("%d", i); first = false; }
    else printf("% d", i);
    for (int j = 1; j <= k; j++) if (G[i][j] && dp[i] == dp[j] + 1) {
        print_ans(j);
        break;
    }
}

int main()
{
    while (scanf("%d%d", &k, &n) != EOF) {
        memset(G, false, sizeof(G));
        for (int i = 1; i <= k; i++)
            for (int j = 0; j < n; j++)
                scanf("%d", &box[i][j]);
        for (int i = 1; i <= k; i++) sort(box[i], box[i] + n);
        for (int i = 1; i <= k; i++)
            for (int j = 1; j <= k; j++) if (judge(i, j))
                G[i][j] = true;
        memset(dp, 0, sizeof(dp));
        for (int i = 1; i <= k; i++) cal(i);
        int max_index = 1;
        for (int i = 1; i <= k; i++) if (dp[i] > dp[max_index]) max_index = i;
        first = true;
        printf("%d\n", dp[max_index]);
        print_ans(max_index);
        printf("\n");
    }
    return 0;
}
时间: 2024-08-25 22:28:47

uva103-Stacking_Boxes的相关文章

uva103 - Stacking Boxes(DAG)

题目:uva103 - Stacking Boxes(DAG) 题目大意:给出N个boxes, 并且给出这些箱子的维度,要求找一个最长的序列,能够使得下面的箱子一定能够有个维度序列大于上面的那个箱子的维度序列.例如:A箱子(2 3 4),B箱子(3 4 5),因为有个序列2 3 4 , 3 4 5使得B每个维度的值都大于A,所以A可以在B上面 . 解题思路:DAG.将这些箱子哪个能在哪个上面处理出有向图出来,这里判断是否可以在上面的情况,只要将这两个箱子的维度都从小到大排下序,然后比较一下是否对

UVA103 dp基础题,DAG模型

1.UVA103 嵌套n维空间 DAG模型记忆化搜索,或者 最长上升子序列. 2.dp[i]=max( dp[j]+1),(第i个小于第j个) (1) //DAG模型记忆化搜索 #include<bits/stdc++.h> using namespace std; #pragma comment(linker, "/STACK:102400000,102400000") #define F(i,a,b) for (int i=a;i<b;i++) #define F

uva103(最长递增序列,dag上的最长路)

题目的意思是给定k个盒子,每个盒子的维度有n dimension 问最多有多少个盒子能够依次嵌套 但是这个嵌套的规则有点特殊,两个盒子,D = (d1,d2,...dn) ,E = (e1,e2...en) 只要盒子D的任意全排列,小于盒子E,那么就说明 盒子D能放入盒子E中,其实就是将两个盒子的维度排序,如果前一个盒子的维度依次小于后一个盒子,那么就说明前一个盒子能放入后一个盒子中 这个题目能够转化为最长递增子序列. 首先将盒子的维度从小到大排序,然后将k个盒子,按照排序后的第一维度从小到大排

UVA103

UVA 103 题意: 有 n 个盒子,每个盒子由 k 个元素表示,把盒子互相嵌套起来,只有表示盒子的每个元素都大于另一个盒子的每个元素的时候才可以嵌套:元素间可以交换位置: 比如(5,1,3)可以放在 (2,4,6)里面. 问最多可以套多少个. 解题: 先把表示盒子的每个元素排序,再把每个盒子排序.用 LIS 求答案. 噫..盒子排序排了好久..傻了= = #include<bits/stdc++.h> using namespace std; struct node { int s,id;

【UVA103】Stacking Boxes(LIS输出路径)

Stacking Boxes Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status Practice UVA 103 Appoint description:  System Crawler  (2015-07-19) Description Background Some concepts in Mathematics and Computer Science are simpl

简单Dp----最长公共子序列,DAG最长路,简单区间DP等

/* uva 111 * 题意: * 顺序有变化的最长公共子序列: * 模板: */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[100]; int mu[100]; int Dp[100][100]; int main() { int n,x; scanf("%d", &n