zoukankan      html  css  js  c++  java
  • DAG 动态规划 巴比伦塔 B

    题目:The Tower of Babylon

    这是一个DAG 模型,有两种常规解法

    1.记忆化搜索, 写函数,去查找上一个符合的值,不断递归

    2.递推法

    方法一:记忆化搜索
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    struct node
    {
        int x,y,z;
        node(int x=0,int y=0,int z=0) : x(x) , y(y) , z(z){}
    }exa[5000];
    
    bool cmp(node a,node b)
    {
        if(a.x==b.x) return a.y>b.y;
        else return a.x>b.x;
    }
    
    int n;
    int dp[10000];
    bool vis[10000];
    
    int d(int e)
    {
        if(vis[e]) return dp[e];
        vis[e]=1;
        int &ans=dp[e];
        ans=exa[e].z;
        for(int i=1;i<e;i++)
        {
    //        printf("exa[%d].x=%d
    ",i,exa[i].x);
    //        printf("exa[%d].y=%d
    ",i,exa[i].y);
    //        printf("exa[%d].x=%d
    ",e,exa[e].x);
    //        printf("exa[%d].y=%d
    ",e,exa[e].y);
            if(exa[i].x>exa[e].x&&exa[i].y>exa[e].y)
            {
                ans=max(ans,d(i)+exa[e].z);
              //  cout<<ans<<" "<<i<<endl;
            }
        }
        return ans;
    }
    
    int main()
    {
        int num=0;
        while(scanf("%d",&n)==1&&n)
        {
            memset(dp,0,sizeof(dp));
            memset(vis,0,sizeof(vis));
            for(int i=1;i<=n;i++)
            {
                int a,b,c;
                scanf("%d%d%d",&a,&b,&c);
                exa[i]=node(a,b,c);
                exa[n+i]=node(b,c,a);
                exa[n*2+i]=node(b,a,c);
                exa[n*3+i]=node(a,c,b);
                exa[n*4+i]=node(c,a,b);
                exa[n*5+i]=node(c,b,a);
            }
            n*=6;
            sort(exa+1,exa+n+1,cmp);
            int ans=0;
            for(int i=1;i<=n;i++)
            {
                int tmp=d(i);
                ans=max(ans,tmp);
            }
            printf("Case %d: maximum height = %d
    ",++num,ans);
        }
        return 0;
    }
    

      

    方法二:递推法
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <algorithm>
    using namespace std;
    struct node
    {
        int x,y,z;
        node(int x=0,int y=0,int z=0) : x(x) , y(y) , z(z){}
    }exa[500];
    bool cmp(node a,node b)
    {
        if(a.x==b.x) return a.y>b.y;
        else return a.x>b.x;
    }
    
    int n;
    int dp[1000];
    
    int main()
    {
        int num=0;
        while(scanf("%d",&n)==1&&n)
        {
            memset(dp,0,sizeof(dp));
            for(int i=1;i<=n;i++)
            {
                int a,b,c;
                scanf("%d%d%d",&a,&b,&c);
                exa[i]=node(a,b,c);
                exa[n+i]=node(b,c,a);
                exa[n*2+i]=node(b,a,c);
                exa[n*3+i]=node(a,c,b);
                exa[n*4+i]=node(c,a,b);
                exa[n*5+i]=node(c,b,a);
            }
            n*=6;
            int ans=0;
            sort(exa+1,exa+n+1,cmp);
            for(int i=1;i<=n;i++)
            {
                dp[i]=exa[i].z;
                for(int j=1;j<i;j++)
                {
                    if(exa[i].x<exa[j].x&&exa[i].y<exa[j].y)
                    {
                        dp[i]=max(dp[i],dp[j]+exa[i].z);
                        //cout<<dp[i]<<"ww "<<i<<endl;
                    }//cout<<dp[i]<<" "<<i<<endl;
                }
                ans=max(ans,dp[i]);
            }
            printf("Case %d: maximum height = ",++num);
            cout<<ans<<endl;
        }
        return 0;
    }
  • 相关阅读:
    WPF学员管理系统
    dotnet-千星项目OpenAuthNet基于NetCore21的快速开发框架
    MVC5仓库管理系统
    华为设备IPC V200R002C0SPC SDK连接demo
    基础界面
    交通建设项目管理信息化系统
    Apache常见interview
    mamcached+(magent+keepalived高可用)搭建及理论概述
    TCP/IP三次挥手,四次断开(精简)
    简述FTP的主动模式与被动模式(精简)
  • 原文地址:https://www.cnblogs.com/EchoZQN/p/10233586.html
Copyright © 2011-2022 走看看