Stacking Boxes UVA - 103(DAG上的dp)

思路

方法和刘汝家介绍的一样,先利用关系建图,然后dp计算从每个点开始的最大长度。需要注意的是,建图之前需要将各个维度从小到大进行排序。进行排序可以保证建图的完整性。
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+7;
typedef long long ll;
int n,k;
int tmp[40][40];
int mp[40][40];
int dp[50];
int before[40];
int dfs(int pos)
{
    int& ans=dp[pos];
    if(ans>0) return ans;
    ans=1;
    for(int j=1;j<=n;j++)
    {
        if(mp[pos][j])
        {
            ans=max(ans,dfs(j)+1);
        }
    }
    return ans;
}
void print(int i)
{
    printf("%d ",i);
    for(int j=1;j<=n;j++)
    {
        if(mp[i][j]&&dp[i]==dp[j]+1)
        {
            print(j);
            break;
        }
    }
}
int main(int argc, char const *argv[])
{
    #ifndef ONLINE_JUDGE
        freopen("in.txt","r",stdin);
        freopen("out.txt","w",stdout);
    #endif
    while(scanf("%d%d",&n,&k)!=EOF)
    {
       memset(mp,0,sizeof(mp));
       memset(dp,0,sizeof(dp));
       for(int i=1;i<=n;i++)
       {
           for(int j=1;j<=k;j++)
           {
               scanf("%d",&tmp[i][j]);
           }
       }
       for(int i=1;i<=n;i++)
       {
           sort(tmp[i]+1,tmp[i]+1+k);
       }
       for(int i=1;i<=n;i++)
       {
           for(int j=1;j<=n;j++)
           {
               int f=0;
               for(int d=1;d<=k;d++)
               {
                   if(tmp[i][d]>=tmp[j][d])
                   {
                       f=1;
                       break;
                   }
               }
               if(f==0)
               {
                   mp[i][j]=1;
               }
           }
       }
       int ans=0;
       int flag=0;
       for(int i=1;i<=n;i++)
       {
           int tmp=dfs(i);
           if(tmp>ans)
           {
               ans=tmp;
               flag=i;
           }
       }
       printf("%d\n",ans);
       print(flag);
       cout<<endl;
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_40774175/article/details/82797356