码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2018-08-14 12:11:24      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:tmp   turn   color   矩形   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\n",tmp);
50     }
51 
52     return 0;
53 }

记忆化很舒适

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

标签:tmp   turn   color   矩形   dag   嵌套矩形   动态规划   介绍   硬币   

原文地址:https://www.cnblogs.com/aininot260/p/9473700.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!