hdu1069 經典dp例題 monkey and Banana
阿新 • • 發佈:2018-11-13
思路:這道題的核心是對於狀態方程的設立,在這裡dp[i]表示的在已經堆好的磚塊下面再墊上第i塊石頭的高度,建立完dp後,再找出所有dp裡面的最大值。需要注意的是一個磚頭可以產生6種狀態。然後其中一個細節是需要用sort自定義排序,順序是長度最小的在前面,長度相同則寬度小的在前,這樣處理的好處是方便你在建立dp的過程中優化,具體的優化細節可以在程式碼中看;
程式碼:
#include<cstdio> #include<cstring> #include<cstdlib> #include<algorithm> using namespace std; const int maxn = 200; struct BLOCK { int l, w, h; }block[maxn]; int dp[maxn]; bool cmp(BLOCK a, BLOCK b) { if (a.l == b.l) return a.w < b.w; return a.l < b.l; } int main() { int n; int T = 0; while (scanf("%d", &n) && n) { memset(dp, 0, sizeof(dp)); int len = 0; int p = 0; while (p != n) { p++; int a, b, c; scanf("%d %d %d", &a, &b, &c); block[len].l = a; block[len].w = b; block[len++].h = c; block[len].l = a; block[len].w = c; block[len++].h = b; block[len].l = b; block[len].w = a; block[len++].h = c; block[len].l = b; block[len].w = c; block[len++].h = a; block[len].l = c; block[len].w = a; block[len++].h = b; block[len].l = c; block[len].w = b; block[len++].h = a; } sort(block, block + len, cmp); dp[0] = block[0].h; int mx = 0; for (int i = 1; i < len; i++) { mx = 0; for (int j = 0; j < i; j++) { if (block[j].l < block[i].l&&block[j].w < block[i].w) mx = mx > dp[j] ? mx : dp[j]; } dp[i] = mx + block[i].h; } mx = 0; for (int i = 0; i < len; i++) { if (mx < dp[i]) mx = dp[i]; } printf("Case %d: maximum height = %d\n", ++T,mx); } // system("pause"); return 0; }