嵌套矩形——DAG上的动态规划
????? 有向無環(huán)圖(DAG,Directed Acyclic Graph)上的動(dòng)態(tài)規(guī)劃是學(xué)習(xí)動(dòng)態(tài)規(guī)劃的基礎(chǔ)。很多問題都可以轉(zhuǎn)化為DAG上的最長(zhǎng)路、最短路或路徑計(jì)數(shù)問題。
?? ?? 有n個(gè)矩形,每個(gè)矩形可以用兩個(gè)整數(shù)a,b描述,表示它的長(zhǎng)和寬。矩形X(a,b)可以嵌套在矩形Y(c,d)中當(dāng)且僅當(dāng)a<c,b<d,或者b<c,a<d(相當(dāng)于把矩形X旋轉(zhuǎn)90°)。例如(1,5)可以嵌套在(6,2)內(nèi),但不能嵌套在(3,4)內(nèi)。你的任務(wù)是選出盡可能多的矩形排成一行。使得除了最后一個(gè)之外,每個(gè)矩形都可以嵌套在下一個(gè)矩形內(nèi)。
分析:
?????? 矩形之間的"可嵌套"關(guān)系是一個(gè)典型的二元關(guān)系,二元關(guān)系可以用圖來建模。如果矩形X可以嵌套在矩形Y里,我們就從X到Y(jié)連一條有向邊。這個(gè)有向圖是無環(huán)的,因?yàn)橐粋€(gè)矩形無法直接或間接地嵌套在自己的內(nèi)部。換句話說,它是一個(gè)DAG。這樣,我們的任務(wù)便是求DAG上的最長(zhǎng)路徑。
方法一:
#include "stdio.h" #include "string.h" #define maxn 1000+10 typedef struct { //矩形的數(shù)據(jù)結(jié)構(gòu),長(zhǎng)、寬 int length; int width; }rectangle;int G[maxn][maxn]; //DAG圖的矩陣表示 int d[maxn],n; //d[i]頂點(diǎn)i的最長(zhǎng)路徑 rectangle rec[maxn];//打印出圖的鄰接矩陣,目的是確保建圖正確無誤 void print_Graph() {printf("|矩 形|");for(int i=0;i<n;i++) printf("%2d,%2d|",rec[i].length,rec[i].width);printf("\n");for(int i=0;i<n;i++){for(int k=0;k<=n;k++)printf("------");printf("\n");printf("|%2d,%2d|",rec[i].length,rec[i].width);for(int j=0;j<n;j++){printf(" %d |",G[i][j]);}printf("\n");} }//構(gòu)造圖 void createGraph() {memset(G,0,sizeof(G));for(int i=0;i<n;i++){for(int j=0;j<n;j++){if(rec[i].length>rec[j].length && rec[i].width>rec[j].width){ G[i][j]=1; //rec[i] 包含 rec[j]}}}// print_Graph(); }//記憶化搜索程序 int dp(int i) {int& ans=d[i]; //為該表項(xiàng)聲明一個(gè)引用,簡(jiǎn)化對(duì)它的讀寫操作。 if(ans>0) return ans;ans=1;for(int j=0;j<n;j++){if(G[i][j]){int tmp=dp(j);ans=ans>tmp+1?ans:tmp+1; }}return ans; }int main() {int N;scanf("%d",&N);while(N-->0){int ans=0;scanf("%d",&n); for(int i=0;i<n;i++){int tmp1,tmp2;scanf("%d%d",&tmp1,&tmp2);rec[i].length=tmp1>tmp2?tmp1:tmp2;rec[i].width=tmp1<tmp2?tmp1:tmp2; }createGraph();//初始化記憶數(shù)組 memset(d,0,sizeof(d)); for(int i=0;i<n;i++){int tmp=dp(i);ans=ans>tmp?ans:tmp; }printf("%d\n",ans);} return 0; } 題目來源NYOJ: http://acm.nyist.net/JudgeOnline/problem.php?pid=16
方法二:可以點(diǎn)我!
總結(jié)
以上是生活随笔為你收集整理的嵌套矩形——DAG上的动态规划的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数字三角形——递归、递推、记忆化搜索
- 下一篇: 硬币问题——固定终点的最长路和最短路