• 动态规划: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 }

    记忆化很舒适

  • 相关阅读:
    C# Path 目录
    Maxscript 窗体与结构体this的传递
    python---文件操作
    python---数据类型---集合
    python---购物车---更新
    python---三级菜单
    python---数据类型---字典
    python---数据类型---字符串
    python---购物车
    python---数据类型---列表
  • 原文地址:https://www.cnblogs.com/aininot260/p/9473700.html
Copyright © 2020-2023  润新知