• UVA103


    UVA 103

    题意:

    有 n 个盒子,每个盒子由 k 个元素表示,把盒子互相嵌套起来,
    只有表示盒子的每个元素都大于另一个盒子的每个元素的时候才可以嵌套;元素间可以交换位置;
    比如(5,1,3)可以放在 (2,4,6)里面。
    问最多可以套多少个。

    解题:

    先把表示盒子的每个元素排序,再把每个盒子排序。用 LIS 求答案。

    噫..盒子排序排了好久..傻了= =

    #include<bits/stdc++.h>
    using namespace std; 
    struct node {
        int s,id;
        int num[25];
        bool operator < (const node &b) const {
            for(int i=1; i<=s; i++) {
                if(num[i] < b.num[i]) return true;
                if(num[i] > b.num[i]) return false;
            }
            return true;
        }    
        void nsort(){
            sort(num+1,num+1+s);
        }
    }a[35];
    int main()
    {
        int n,k;
        while(scanf("%d%d",&n,&k)!=EOF) {
            for(int i=1;i<=n;i++) {
                for(int j=1;j<=k;j++) {
                    scanf("%d",&a[i].num[j] );
                    a[i].s = k; a[i].id = i;
                }
                a[i].nsort();        
            }
            sort(a+1,a+n+1);        
            int len = 1, d[35] = {0};
            int pre[35] = {0}, ed = 1;
            for(int i=0;i<35;i++) pre[i] = i;    
            for(int i=1;i<=n;i++) {
                d[i] = 1;
                for(int j=1;j<i;j++) {                    
                    int ov = 0;
                    for(int r=1;r<=k;r++) {
                        if(a[j].num[r] >= a[i].num[r]) {
                            ov = 1; break;
                        }
                    }             
                    if( (!ov) && (d[j]+1 > d[i]) ) {
                        d[i] = d[j] + 1;
                        pre[i] = j;
                        if(d[i] > len) {
                            len = d[i]; ed = i;
                        }
                    }
                }
            } 
            int ans[35] = {0}, cnt = 0;
            while(ed != pre[ed]) {
                ans[cnt++] = a[ed].id;
                ed = pre[ed];
            } 
            ans[cnt] = a[ed].id; 
            printf("%d
    ",len); 
            for(int i=cnt;i>0;i--)
                printf("%d ",ans[i]);
            printf("%d
    ",ans[0]);
        }    
        return 0;
    }
  • 相关阅读:
    php的session和cookie
    CRUD
    hibernate关系映射
    hibernate hql
    String和StringBuffer的区别
    策略模式Strategy
    项目结构
    final关键字
    项目中的建议
    struts学习记录
  • 原文地址:https://www.cnblogs.com/ember/p/5745928.html
Copyright © 2020-2023  润新知