UVA 437 巴比伦塔(DAG上的动态规划)

来源:互联网 发布:淘宝宝贝访客突然增加 编辑:程序博客网 时间:2024/05/29 16:59

      红书上的动态规划专题

题意:有n种立方体,每种都有无穷多个,要求选一些立方体摞成一根尽量高的柱子,可以自行选一边当多高,使得每个立方体的底面长宽分别严格小于它下方的立方体的底面长宽


思路:各个立方体 “能否被摞”关系是一个典型的二元关系,二元关系可以用图来建模,如果b能摞在a上,a到b就有一条有边向,所以这就是一个DAG,所要求的便是DAG上的最长路径,因为任意一条边都可以当作高,所以每一种立方体都可以扩展为3种立方体


nyoj上矩形嵌套问题与这道题十分相似,可以去看看


#include <stdio.h>#include <iostream>#include <algorithm>#include <string.h>#include <string>#include <vector>#include <queue>#include <stack> #include <set>#include <map>using namespace std;typedef long long ll;int G[100][100];int dp[100];struct NODE{int x,y,z;}a[100];int n;//判断a2是否能落在a1上    bool isline(struct NODE a1,struct NODE a2){if(a1.x>a2.x&&a1.y>a2.y) return true;else if(a1.y>a2.x&&a1.x>a2.y) return true;return false;}//记忆化搜索 int DP(int i){if(dp[i]!=-1) return dp[i];dp[i]=a[i].z;for(int j=1;j<=3*n;j++)   if(G[i][j]) dp[i]=max(dp[i],DP(j)+a[i].z);return dp[i];   }int main(void){int x,y,z;int Case=0;while(scanf("%d",&n)!=EOF&&n){int j=1;int i=n;//每一种立方体都可以确定三种立方体 while(i--){scanf("%d%d%d",&x,&y,&z);a[j].x=x;a[j].y=y;a[j++].z=z;a[j].x=z;a[j].y=x;a[j++].z=y;a[j].x=y;a[j].y=z;a[j++].z=x;     }     //建图      memset(G,0,sizeof(G));     for(i=1;i<=3*n;i++)         for(j=1;j<=3*n;j++)             if(isline(a[i],a[j]))   G[i][j]=1;memset(dp,-1,sizeof(dp));int  ans=0;for(i=1;i<=3*n;i++)    ans=max(ans,DP(i));printf("Case %d: maximum height = %d\n", ++Case, ans);          }    return 0;} 

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 6岁儿童视力0.5怎么办 单一的三系减少怎么办 血小板低到50该怎么办 放化疗后白细胞低怎么办 化疗后白细胞低发烧怎么办 全程c反应蛋白高怎么办 儿童c反应蛋白高怎么办 c反应蛋白高是怎么办 新生儿c反蛋白高怎么办 c反应蛋白高发烧怎么办 血沉高到50了怎么办啊 血沉和超敏偏高怎么办 孕37周血糖偏高怎么办 孕37周血糖7.0多怎么办 孕妇超敏crp偏高怎么办 高敏c反应蛋白高怎么办 孕17周尿蛋白高怎么办 血小板低到20该怎么办 血象高发烧39度怎么办 新生儿血象3万多怎么办 血象高发烧不退怎么办 半岁宝宝血象高怎么办 5-6小孩免疫力差怎么办 快速c反应蛋白高怎么办 15个月宝宝发烧怎么办 小孩发烧到40度怎么办 孩子发烧到39度怎么办 宝宝抵抗力差总生病怎么办 献血前没休息好怎么办 拔了牙齿一直流血怎么办 拔牙后血块掉了怎么办 生血功能不强怎么办 孕妇白球比偏低怎么办 凝血因子Ⅷ很高怎么办 怀孕一个月上火了怎么办 38周了还没入盆怎么办 妊娠33周血压高怎么办 孕34周突然流血怎么办 达英35漏服一天怎么办 华法林忘记2天吃怎么办 肾移植后感冒了怎么办