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;}
阅读全文
0 0
- UVA 437 巴比伦塔(DAG上的动态规划)
- UVA 437 例题9-2 巴比伦塔 (DAG上的动态规划)
- UVA 437 The Tower of Babylon 巴比伦塔(DAG上的动态规划)
- uva 437 DAG上的动态规划
- 记忆化搜索,动态规划(巴比伦塔,uva 437)
- The Tower of Babylon DAG上的动态规划+uva
- UVA 103 Stacking Boxes (DAG上的动态规划)
- DAG上的动态规划
- DAG上的动态规划
- DAG上的动态规划
- DAG上的动态规划
- DAG上的动态规划
- UVa437巴比伦塔(DAG上的DP·LIS)
- UVA 437 The Tower of Babylon(DAG上的动态规划)
- DAG 上的动态规划(白书)
- DAG上的动态规划------硬币问题
- 嵌套模型(DAG上的动态规划
- DAG 上的动态规划(一)
- 使用Tensorboard 分析cifar10 model
- ImageView(图片缓存内存中+图片二次采样)
- 幸福的路
- SpringBoot之拦截器(E)
- print/fprint
- UVA 437 巴比伦塔(DAG上的动态规划)
- Linux功耗管理(5)_Hibernate和Sleep功能介绍
- 三张表 一对多 分页查询
- 垂直居中
- Power Strings
- GridView导出Excel的超好例子
- nginx返回部分数据的问题
- log4j.xl -mybatis的日志输出
- Javascript中实现trim()函数的两种方法