動態規劃 DAG模型

2021-07-04 09:15:05 字數 1307 閱讀 8146

dag(有向無環圖)上的動態規劃是學習動態規劃的基礎。

有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x(a,b)可以巢狀在矩形y(c,d)中當且僅當a < c,b < d或者b < c,a < d(相當於旋轉x90度)。例(1,5)可以巢狀在(6,2)內,但不能巢狀在(3,4)中。你的任務是選出盡可能多的矩形排成一行,使得除最後乙個外,每乙個矩形都可以巢狀在下乙個矩形內。

得動態轉移方程:d(i)=max

其中e為邊集。求解:

//現假設鄰接矩陣已求出,存放在矩陣g中。

int dp(int i)

}

n種硬幣,面值分別為v1,v2,…vn,每種都有無限多。給定非負整數s,可以選用多少個硬幣,使得面值之和恰好為s?輸出硬幣數目的最小值和最大值。

//最長路的** | 【初始化】mamset(d, -1, sizeof(d)); | (有瑕疵)

int dp(int s)

//【bug】s不一定可到達0

//【修正】

int dp(int s)

//【tips】用特殊值(如-1)表示"未算過",則必須將其和其他特殊值(如無解)

//區分開。求最大值時最好將初值設為"無窮小"。

//【可讀性優化】用vis陣列記錄訪問狀態。用空間代價增強**可讀性,減少**出錯可能性。

int dp(int s)

minv[0] = maxn[0] = 0;

for(int i=1; i<=s; i++)

for(int i=1; i<=s; i++)

for(int j=1; j<=n; j++)

if(i>=v[j])

printf("%d

%d\n", minv[s], maxv[s]);

輸出字典序最小的方案(狀態的可逆)

//【遞迴列印】

void print_ans(int* d, int s)

}

//【遞推列印】

void print_ans(int* d, int s)

}for(int i=1; i<=s; i++)

for(int j=1; i<=n; j++)

if(i>=v[j])

if(max[i]}

print_ans(min_coin, s);

print_ans(max_coin, s);

動態規劃 DAG模型

有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a c,b d或者b c,a d 相當於旋轉x90度 例 1,5 可以巢狀在 6,2 內,但不能巢狀在 3,4 中。你的任務是選出盡可能多的矩形排成一行,使得除最後乙個外,每乙個矩形都可以巢狀在下...

動態規劃 DAG模型 硬幣問題

題目 有n種硬幣,面值分別為v1,v2,vn,每種都有無限多。給定非負整數s,可以選用多少個硬幣,使得面值之和恰好為s?輸出硬幣數目的最小值和最大值!dag問題的動態規劃求解 includeusing namespace std typedef long long ll typedef long d...

DAG模型 矩形鑲嵌(動態規劃)

dag模型 矩形鑲嵌 n個矩形排成一行,找出做多的矩形,使左邊的矩形可以鑲嵌在右邊的矩形中。矩形滿足鑲嵌也就是左邊長寬a,b,右邊長寬c,d構成 a include include using namespace std define maxn 105 struct nec struct nec r...