問題描述:
巢狀矩形問題。 有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...