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;
    }
  • 相关阅读:
    美国godaddy服务器,生成html网页出错,Microsoft VBScript runtime error '800a0005'
    Socket 错误一览表
    用php\asp创建 网页桌面快捷方式
    xp sp3 + ie8 支付宝证书 导入出错以及安全验证身份出错 解决办法
    Windows Server 2008正式版激活方法(2009年6月26日更新)
    子网掩码表示 255.255.255.0/24
    局域网中2台无线路由器联接配置方法
    firebug不能断点调试压缩后的js文件问题
    php正则匹配 <div></div>
    apache2 子目录forbidden问题
  • 原文地址:https://www.cnblogs.com/EchoZQN/p/10233586.html
Copyright © 2011-2022 走看看