博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UVA 103 Stacking Boxes 套箱子 DAG最长路 dp记忆化搜索
阅读量:7238 次
发布时间:2019-06-29

本文共 1483 字,大约阅读时间需要 4 分钟。

题意:给出几个多维的箱子,如果箱子的每一边都小于另一个箱子的对应边,那就称这个箱子小于另一个箱子,然后要求能够套出的最多的箱子。

要注意的是关系图的构建,对箱子的边排序,如果分别都小于另一个箱子就说明是箱子小于,重载<即可。

然后就是正常的dp最长路的搜索了。

代码:

 

/**  Author:      illuz 
* Blog: http://blog.csdn.net/hcbbt* File: uva103.cpp* Create Date: 2013-09-12 19:32:36* Descripton: dp */#include
#include
#include
using namespace std;const int MAXN = 100;struct Box { int dem; int e[30]; void Sort() { sort(e, e + dem); } bool operator < (const Box& a) const { for (int i = 0; i < dem; i++) if (e[i] >= a.e[i]) return false; return true; }} b[MAXN];int big[MAXN][MAXN], k, t;int dp[MAXN];int solve(int i) { if (dp[i] > 0) return dp[i]; dp[i] = 1; for (int j = 0; j < t; j++) if (big[i][j]) dp[i] = max(dp[i], solve(j) + 1); return dp[i];}void output(int i) { for (int j = 0; j < t; j++) if (big[i][j] && dp[i] == dp[j] + 1) { printf(" %d", j + 1); output(j); break; }}int main() { while (scanf("%d%d", &t, &k) != EOF) { for (int i = 0; i < t; i++) { for (int j = 0; j < k; j++) { b[i].dem = k; scanf("%d", &b[i].e[j]); } b[i].Sort(); } memset(big, 0, sizeof(big)); memset(dp, 0, sizeof(dp)); for (int i = 0; i < t; i++) for (int j = 0; j < t; j++) if (i != j && b[i] < b[j]) big[i][j] = 1; for (int i = 0; i < t; i++) solve(i); int tt = 0; for (int i = 0; i < t; i++) if (dp[i] > dp[tt]) tt = i; printf("%d\n", dp[tt]); printf("%d", tt + 1); output(tt); printf("\n"); } return 0;}

 

 

你可能感兴趣的文章
centos服务器到网关丢包(nf_conntrack:table full)
查看>>
Keepalive 之 高可用实现
查看>>
Ansible 之 概念和常用模块介绍
查看>>
Python实例:字典运算:查找字典中的最大最小值
查看>>
git rebase(高级)
查看>>
电信2月国内市场份额52.22% 环比上月下降0.61%
查看>>
6月21日全球域名注册商(国际域名)保有量及市场份额
查看>>
批量设置0777
查看>>
centos6对xen4.2的支持
查看>>
用rsync同步公网centos yum源做本地yum源服务器
查看>>
linux sftp
查看>>
Linux的两种随机数生成器
查看>>
freeradius+mysql+pppoe认证
查看>>
与“十“俱进 阿里数据库运维10年演进之路
查看>>
关于运维人员的未来职业生涯
查看>>
git 学习笔记
查看>>
shell中$0,$,$!等的特殊用法
查看>>
FastDFS_V5.05分布式存储安装与使用
查看>>
2014年下半年信息系统项目管理师上午试题试题与答案 37
查看>>
简单可达性分析
查看>>