zoukankan      html  css  js  c++  java
  • UVa 103

    链接:UVa 103

    题意:给n维图形,它们的边长是{d1,d2,d3...dn},  对于两个n维图形,求满足当中一个的全部边长

    依照随意顺序一一相应小于还有一个的边长,这种最长序列的个数,而且打印随意一个最长子串的路径,

    比如:a(9,5,7,3),b(6,10,8,2),c(9,7,5,1),a和b不满足,但c和b满足

    分析:首先对没组边长从小到大排序,再对各组图形按最小边排序,再求最大子串,

    对于打印路径,能够逆序循环,也可递归求解

    #include<cstdio>
    #include<algorithm>
    using namespace std;
    int dp[35],path[35],num,m,k;
    struct stu
    {
        int a[12],id;
    }s[35];
    int cmp(struct stu s1,struct stu s2)
    {
        return s1.a[1]<s2.a[1];
    }
    /*void back_path1(int i)
    {
        if(path[i]!=i)
            back_path1(path[i]);
        printf("%d",s[i].id);
        num++;
        if(num!=m)
            printf(" ");
        else
            printf("
    ");
    }*/
    /*void back_path2(int i)
    {
        if(k--){
            back_path2(path[i]);
            printf("%d",s[i].id);
            num++;
            if(num!=m)
                printf(" ");
            else
                printf("
    ");
        }
    }*/
    int main()
    {
        int i,j,n,pos,b[1005];
        while(scanf("%d%d",&m,&n)!=EOF){
            for(i=1;i<=m;i++){
                s[i].id=i;
                for(j=1;j<=n;j++)
                    scanf("%d",&s[i].a[j]);
                sort(s[i].a+1,s[i].a+n+1);      //对每一个图形的边长排序
            }
            sort(s+1,s+m+1,cmp);   //对各个图形之间,按最小边长的大小排序
            for(i=1;i<=m;i++){
                dp[i]=1;
                path[i]=i;
                for(j=1;j<i;j++){
                    for(k=1;k<=n;k++)
                        if(s[j].a[k]>=s[i].a[k])
                            break;
                    if(k==n+1&&dp[j]+1>dp[i]){
                        dp[i]=dp[j]+1;
                        path[i]=j;
                    }
                }
            }
            pos=1;
            for(i=2;i<=m;i++)
                if(dp[i]>dp[pos])
                    pos=i;
            m=dp[pos];
            printf("%d
    ",m);
            b[1]=s[pos].id;       //先把最后一个编号增加
            i=2;
            for(j=pos-1;j>=1;j--){          //逆序循环求路径
                for(k=1;k<=n;k++)
                    if(s[j].a[k]>=s[pos].a[k])
                        break;
                if(k==n+1&&dp[j]+1==dp[pos]){
                    b[i++]=s[j].id;
                    dp[pos]--;
                }
                if(dp[pos]==1)
                    break;
            }
            for(j=i-1;j>1;j--)
                printf("%d ",b[j]);
            printf("%d
    ",b[1]);
            /*num=0;            //递归方法1            
            back_path1(pos);*/
            /*num=0;            //递归方法2
            k=m;
            back_path2(pos);*/
        }
        return 0;
    }


  • 相关阅读:
    未启用当前数据库的 SQL Server Service Broker,因此查询通知不受支持。如果希望使用通知,请为此数据库启用 Service Broker
    .net remoting 尝试
    上传图片时获取所传图片大小
    图象处理算法(二)
    对CollapablePanel控件的改进
    一个简单的网页计数器
    ValidateBox控件使用Ajax改进
    图象处理算法(四)
    常用技巧(一)
    在Asp.Net里使用自定义映射进行重定向
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3963232.html
Copyright © 2011-2022 走看看