DGA模型 巢狀矩形與硬幣問題

2021-08-15 02:49:26 字數 2532 閱讀 7543

問題描述:

巢狀矩形問題。 有n個矩形,每個矩形可以用兩個整數a,b描述,表示它的長和寬。矩形x(a,b)可以巢狀在矩形y(c,d)中,當且僅當 a小於c,b小於d,或者,b小於c,a小於d。例如x(1,5)能巢狀在y(6,2)中,但不能巢狀在(3,4)中。你的任務是選出盡量多的矩形排成一行,使得除最後乙個外,每乙個矩形都可以巢狀在下乙個矩形內。如果有多解,矩形編號的字典序應盡量小。

–摘自劉汝佳《演算法競賽入門經典》9.2章

解答思路:

矩形的「可巢狀」關係是乙個典型的二元關係,可用圖來構造模型求解。顯然,矩形的巢狀關係可用dag來表示。並且,本題構造出來的dag是無環的。而我們所求能巢狀的矩陣長度則可轉化為求解dag上的最長路徑問題。

而題目沒有給出最長的路徑明確的起點和終點,因此,每個節點都可能是最優的起點,需要遍歷各個頂點一次。

輸入資料及初始化:

6 //矩形個數

3 4 //每個矩形的長和寬

2 5

1 2

5 6

4 5

4 5

#include

#include

using

namespace

std;

struct node arr[1024];

int x, g[1024][1024], d[1024];

int f(int m)

void prin(int i)

}}int main(void)

for (int i = 0; i < x; i++)

for (int j = 0; j < x; j++)

if (((arr[i].a > arr[j].a)&&(arr[i].b > arr[j].b))||

((arr[i].a > arr[j].b)&&(arr[i].b > arr[j].a)))

g[i][j] = 1;

int mm = 0;

int best;

for (int i = 0; i < x; i++)

}cout

<< mm << endl;;

for (int i = 0; i < x; i++)

cout

<< d[i] << " ";

cout

<< endl;

prin(best);

system("pause");

return

0;}

【問題描述】

有n種硬幣,面值分別為v1,v2,v3,…..vn,每種都有無限多。

給定非負整數s,可以選用多少個硬幣,使得面值之和恰好為s?

輸出硬幣數目的最小值和最大值。1<=n>=100, 0<=s<=10000,1<=vi<=s.

【分析與思路】

思路:本題是固定終點和起點的dag動態規劃。

我們把每種面值看做乙個點,表示「還需要湊足的面值」,則初始狀態為s,目標狀態為0。

如當前在狀態i,沒使用乙個硬幣j,狀態變轉移到i-vj。

有n種硬幣,面值分別為v1,v2,v3,…..vn,每種都有無限多。

給定非負整數s,可以選用多少個硬幣,使得面值之和恰好為s?

輸出硬幣數目的最小值和最大值。1<=n>=100, 0<=s<=10000,1<=vi<=s.

本題是固定終點和起點的dag動態規劃。

我們把每種面值看做乙個點,表示「還需要湊足的面值」,則初始狀態為s,目標狀態為0。

如當前在狀態i,沒使用乙個硬幣j,狀態變轉移到i-vj。

遞推方法實現  

#include

#include

#define max 10001

#define inf 1000000000;

int n, s;

int v[max] ,vis[max], d[max];

int max[max], min[max] ;

// 輸出最小字典序

void prit_ans(int *d, int s)

} // 主函式、遞推實現最短路最長路

int main ()

// 遞推演算法求解最長最短路

for (i=1; i<=s; i++)///初始化min初始化為最大值,max初始化為最小值

for (i=1; i <= s; i++)///表示的錢數

for (j=1; j<=n; j++)///對應的個數

if(i >= v[j])///當需要表示的錢幣數大於硬幣所能表示的數值時,才可以往下進行

printf("%d %d\n", min[s], max[s]);

// 輸出最優字典序

prit_ans(min, s);

printf("\n");

prit_ans(max, s) ;

printf("\n");

return

0 ;

}

**摘自:

DAG模型 矩形巢狀

有n個矩形,每個矩形可以用兩個整數a,b描述,表示它的長和寬。矩形x a,b 可以巢狀在矩形y c,d 中,當且僅當 a 你的任務是選擇盡量多的矩形排成一行,使得除最後乙個矩形外所有矩形都可以巢狀在下乙個矩形內。如果存在多解,矩形編號的字典序應盡量小。如下 include include inclu...

動態規劃兩題(矩形巢狀 硬幣問題)P161 162

矩形巢狀 有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a輸入 第一行是乙個正正數n 0輸出 每組測試資料都輸出乙個數,表示最多符合條件的矩形數目,每組輸出佔一行 樣例輸入 1 101 2 2 45 8 6 10 7 93 1 5 812 1...

矩形巢狀問題(DP)

題目來自 nyoj 矩形巢狀 有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a輸入的時候處理一下,使座標x y,然後自定義乙個排序函式,以座標x排序,若座標x相等,再以y進行排序,最後轉化為求乙個最長遞增子串行的問題。include incl...