有向無環圖(dag,directed acyclic graph)上的動態規劃是學習動態規劃的基礎。很多問題都可以轉化為dag上的最長路、最短路或路徑計數問題。
一、矩形巢狀
題目描述:
有n個矩形,每個矩形可以用兩個整數a,b描述,表示它的長和寬。矩形x(a,b)可以巢狀在矩形y(c,d)中當且僅當ad(i) = max
其中e為邊集,最終答案為d(i).那如果要求輸出字典序最小的最長路徑呢?那麼必須找到第乙個最長的路徑的值然後遞迴輸出。
**:
#include#include#include#include#includeusing namespace std ;const int mx = 1000 + 10 ;
int n ;
int g[mx][mx],dp[mx] ;
struct node
t[mx] ;
void buildgraph() // 建圖
int dag(int x) // 記憶化求解
return ans ;
}void print(int x) // 列印路徑
int ans=1 ;
buildgraph() ;
memset(dp,-1,sizeof(dp)) ;
for(int i=0 ;ians ? mx : ans ;
}for(int i=0 ;i
#include#include#include#define inf 1<<30
#define maxn 100+10
using namespace std ;
int v[maxn],n;
int min[maxn],max[maxn];
inline int min(int a,int b)
//列印可行的方案
void print_ans(int* d,int s)
}}int main()
print_ans(min,s);
printf(" min\n");
print_ans(max,s);
printf(" max\n");
printf("min:%d max:%d\n",min[s],max[s]);
} return 0;
}
分析:本質上市乙個dag上的路徑問題,我們把每種面值看做乙個點,表示還需湊足的面值,則初始狀態為0,目標狀態為0,若當前在i,則每使用一枚硬幣j,狀態轉移到i-vj。
**:
#include#define n 1100int v[n],min[n],max[n],min_coins[n],max_coins[n];
void print_ans(int *d,int s, int n)
printf("\n");
}int main()
if(max[i](max[i-v[j]]+1)?max[i]:(max[i-v[j]]+1);}}
} printf("%d %d\n",min[s],max[s]);
print_ans(min_coins,s,n);
print_ans(max_coins,s,n);
} return 0;
}
上面的**中,如果不需要輸出路徑的話,則可以不要max_coins和min_coins陣列,下面在寫乙個遞迴的。
#include#include#define n 1100
int v[n],d[n],vis[n];
int dp(int s, int n)
}}int main() {
int t,i,n,s,ans;
scanf("%d",&t);
while(t--) {
scanf("%d %d",&n,&s);
for(i=0;i
DAG上的動態規劃
dag模型 有n個矩形,每個矩形用兩個整數a,b描述,表示長和寬,矩形 a,b 可以巢狀在矩形 c,d 中,當且僅當a小於c,b小於d或b小於c,a小於d。要解決的問題就是從眾多矩形中選出最多的矩形,使其可以按要求排成一列,若有多解,矩形編號的字典序要盡可能小。分析 按照書上的分析很簡單易懂,也容易...
DAG上的動態規劃
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 有n個矩形,每個矩形可以用a,b來描述,表示長和寬。矩形x a,b 可以巢狀在矩形y c,d 中當且僅當a 輸入 第一行是乙個正正數n 0輸出 每組測試資料都輸出乙個數,表示最多符合條件的矩形數目,每組輸出佔一行 樣例輸入 1 ...
DAG 上的動態規劃
暫存 dag 上的動態規劃 訓練指南 大白書 2015年11月04日 16 42 48 閱讀數 1979 有向無環圖 dag,directed acyclic graph 上的動態規劃是學習動態規劃的基礎。很多問題都可以轉化為dag上的最長路 最短路或路徑計數問題。一 矩形巢狀 題目描述 有n個矩形...