据说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 }
记忆化很舒适