日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

嵌套矩形——DAG上的动态规划

發(fā)布時(shí)間:2023/12/1 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 嵌套矩形——DAG上的动态规划 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

????? 有向無環(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。