紅書上的動態規劃專題
題意:有n種立方體,每種都有無窮多個,要求選一些立方體摞成一根盡量高的柱子,可以自行選一邊當多高,使得每個立方體的底面長寬分別嚴格小於它下方的立方體的底面長寬
思路:各個立方體 「能否被摞」關係是乙個典型的二元關係,二元關係可以用圖來建模,如果b能摞在a上,a到b就有一條有邊向,所以這就是乙個dag,所要求的便是dag上的最長路徑,因為任意一條邊都可以當作高,所以每一種立方體都可以擴充套件為3種立方體
nyoj上矩形巢狀問題與這道題十分相似,可以去看看
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
typedef
long
long ll;
int g[100][100];
int dp[100];
struct nodea[100];
int n;
//判斷a2是否能落在a1上
bool
isline
(struct node a1,struct node a2)
//記憶化搜尋
intdp
(int i)
intmain
(void)
//建圖
memset(g,0,sizeof(g));
for(i=1;i<=3*n;i++)
for(j=1;j<=3*n;j++)
if(isline(a[i],a[j]))
g[i][j]=1;
memset(dp,-1,sizeof(dp));
int ans=0;
for(i=1;i<=3*n;i++)
ans=max(ans,dp(i));
printf("case %d: maximum height = %d\n", ++case, ans);
}return
0;}
uva437 巴比倫塔
題意 見紫書 題解 一道水得不能再水的大水題,卻讓我給想多了 每種立方體的長寬高有6種不同的情況,把輸入的拆成6個來考慮 用最長上公升子串行的思維,狀態轉移方程 dp i max dp i dp j p i h 因為開始時立方體是無序的,所以按長或者寬或者什麼神奇的東西拍個序 使能夠讓第i個立方體堆...
27 巴比倫塔 UVa 437
有n n 30 n n 30 n n 30 種立方體,每種都有無窮多個。要求選一些立方體摞成一根盡量高的柱子 可以自行選擇哪一條邊作為高 使得每個立方體的底面長寬分別嚴格小於它下方立方體的底面長寬。include include include include using namespace std...
紫書 UVa437巴比倫塔
題解 這個就是矩形巢狀的改變,把2d變為3d了,然後加1變為加上他們的高度 注意點是乙個矩形可以有三種不同的形態 include include include using namespace std int n int p 儲存各個矩形的數量,乙個矩形有三種 struct juxju 910 in...