一、DAG的介绍

Directed Acyclic Graph,简称DAG,即有向无环图,有向说明有方向,无环表示不能直接或间接的指向自己。

摘录:有向无环图的动态规划是学习动态规划的基础,很多问题都可以转化为DAG上的最长路、最短路或路径计数问题。

通常需要建图,不复杂的也可以当最长上升子序列处理,就不必建图,但都包含运用有向无环图的思想。

二、例题

有n(1 <= n <= 1000)个矩形,长为a,宽为b。矩形X(a,b)可以嵌套在矩形Y(c,d)中,当且仅当a < c,b < d,或者a < d,b < c。求最大的嵌套数。

三、解题思路

矩形X可以嵌套矩形Y,则从X连条边到Y,矩形不能直接或间接的嵌套自己,所以无环。最大的嵌套次数,就是求这个图上的最长路。

四、代码实现

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<cstdbool>
#include<vector>
#include<algorithm>
using namespace std; const int maxn = + ;
struct Node
{
int x, y;
Node(int x, int y) :x(x), y(y) {}
Node() {}
bool operator < (const Node &n)const {
return (x < n.x&& y < n.y) || (x < n.y&& y < n.x);
}
};
vector<Node>vec;
int n;
int d[maxn]; //d[i]表示从节点i出发的最长路的长度
bool G[maxn][maxn];
int cnt = ; //建图
void creatGraph()
{
for (int i = ; i < n; i++)
for (int j = ; j < n; j++)
{
if (vec[i] < vec[j]) G[i][j] = true;
}
} //计算从i出发的最长路径
int dp(int i)
{
int& ans = d[i];
if (ans > ) return ans;
ans = ;
for (int j = ; j < n; j++)
if (G[i][j]) ans = max(ans, dp(j) + );
return ans;
} //解决问题
void slove()
{
creatGraph();
int res = ;
for (int i = ; i < n; i++)
res = max(res, dp(i)); //整体的时间复杂度为O(n^2) printf("Case %d: maximum = %d\n", ++cnt, res);
}
int main()
{
while (scanf("%d", &n) == && n)
{
vec.clear();
memset(d, , sizeof(d));
memset(G, false, sizeof(G));
int x, y;
for (int i = ; i < n; i++)
{
scanf("%d%d", &x, &y);
vec.push_back(Node(x, y));
}
slove();
}
}

当然,这题也可以用最长上升子序列做,可以参考我的前一篇博客。

最新文章

  1. ABP源码分析三十八: ABP.Web.Api.OData
  2. Python下使用help(dict),显示&#39;more&#39;不是内部或外部命令,也不是可运行的程序或批处理文件,该如何处理?
  3. Quartz2D之生成圆形头像、打水印、截图三种方法的封装
  4. 串口 COM口 TTL RS-232 RS-485 区别 释疑
  5. eclipse隐藏菜单栏实现全部酷黑主题
  6. 移植u-boot.2012.04.01
  7. android 线程
  8. 【Android 复习】:AndroidManifest.xml 文件详解
  9. easyui 很好很强大
  10. apache rewrite .htaccess 站点内容重定向实例
  11. 在 .NET 4 中使用托管可扩展性框架构建可组合的应用程序
  12. Tree of Life (easy)
  13. Android 一个改善的okHttp封装库
  14. 【spring实战第五版遇到的坑】3.2中配置关系映射时,表名和3.1中不一样
  15. python flsak 框架
  16. python continue的应用
  17. 嵌入式Linux开发之uboot启动Linux整体流程分析
  18. shell脚本判断安装包位置及类型
  19. h5小功能_classList和自定义属性data
  20. git push -f

热门文章

  1. 技术胖Flutter第四季-20导航的参数传递和接受-1
  2. mysql 事务 存储过程 函数
  3. Git的使用方法与GitHub项目托管方法
  4. iOS 7:漫谈#define 宏定义
  5. 51 Nod 1640 天气晴朗的魔法( Kruskall )
  6. 解决web项目无法部署到eclipse配置的本地tomcat
  7. VLAN-4-在路由器上配置Trunk
  8. 自定义的cell上面有图片时,如果产生了重用,图片可能会错乱问题
  9. python 基础(十三) time模块
  10. POJ-1181-食物链