DAG上的动态规划之嵌套矩形问题

Posted aininot260

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DAG上的动态规划之嵌套矩形问题相关的知识,希望对你有一定的参考价值。

据说DAG是动态规划的基础,想一想还真的是这样的,动态规划的所有状态和转移都可以归约成DAG

DAG有两个典型模型,一个是嵌套矩形问题一个是硬币问题,这里仅介绍一个嵌套矩形问题

等二轮复习的时候再补上

NYOJ16,南阳OJ很不错的样子嘛

如果矩形X可以嵌套到矩形Y中,连有向边X->Y

求DAG的最长路径

这里起点和终点不用刻意给出,因为任意一个矩形都可以作为起点和终点

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 using namespace std;
 5 const int maxn=1005;
 6 int n;
 7 int a[maxn],b[maxn],d[maxn];
 8 int G[maxn][maxn];
 9 int dfs(int x)
10 {
11     if(d[x]>0) return d[x];
12     d[x]=1;
13     for(int i=1;i<=n;i++)
14         if(G[x][i]) d[x]=max(d[x],dfs(i)+1);
15     return d[x];
16 }
17 void print_ans(int x)
18 {
19     printf("%d ",x);
20     for(int i=1;i<=n;i++)
21         if(G[x][i]&&d[x]==d[i]+1)
22         {
23             print_ans(i);
24             break;
25         } 
26 }
27 int main()
28 {
29     int T;
30     scanf("%d",&T);
31     while(T--)
32     {
33         memset(d,0,sizeof(d));
34         memset(a,0,sizeof(a));
35         memset(b,0,sizeof(b));
36         memset(G,0,sizeof(G));
37         scanf("%d",&n);
38         for(int i=1;i<=n;i++)
39             scanf("%d%d",&a[i],&b[i]);
40         for(int i=1;i<=n;i++)
41             for(int j=1;j<=n;j++)
42             {
43                 if(a[i]>a[j]&&b[i]>b[j]||a[i]>b[j]&&b[i]>a[j])
44                     G[i][j]=1;
45             }
46         int tmp=0;
47         for(int i=1;i<=n;i++)
48             tmp=max(tmp,dfs(i));
49         printf("%d
",tmp);
50     }
51 
52     return 0;
53 }

记忆化很舒适

以上是关于DAG上的动态规划之嵌套矩形问题的主要内容,如果未能解决你的问题,请参考以下文章

嵌套矩形(动态规划)

动态规划

UVa 103 Stacking Boxes --- DAG上的动态规划

NYOJ_矩形嵌套(DAG上的最长路 + 经典dp)

经典动态规划 嵌套矩形

The Tower of Babylon UVA - 437 DAG上的动态规划