Monkey and Banana
太帅了, 以前不知道怎么做的题,今天一次提交一次通过。这是对我努力的一种肯定。
这道题我觉得是贪心法加动态规划,一开始把长宽小的置前,然后用类似求最长上升子序列的方法求最大值
虽然一种砖块可以无限次的用, 其实你会发现每种最多也就用三次。所以我把三种情况都放进了结构体,然后排序。
#include <iostream> #include <cstring> #include <algorithm> using namespace std; #define size 200 struct brick{ int l, w, h; //长、宽、高 }bri[size]; int dp[size]; int index_bri; int cmp(const brick &a, const brick &b){ if(a.l == b.l){ if(a.w == b.w) return a.h > b.h; //长宽一样高的靠前 return a.w < b.w; //长度一样宽的靠前 } return a.l < b.l; //长度小的靠前 } void init(int l, int w, int h){ bri[index_bri].l = l; bri[index_bri].w = w; bri[index_bri++].h = h; } int main() { //freopen("in.txt", "r", stdin); int n, i, j, a, b, c, iCase = 0, max; while(cin>>n && n){ index_bri = 0; max = 0; for(i = 0; i < n; i++){ cin>>a>>b>>c; init(a, b, c); //六种情况都放进去 init(a, c, b); init(b, a, c); init(b, c, a); init(c, a, b); init(c, b, a); } sort(bri, bri + index_bri, cmp); for(i = 0; i < index_bri; i++) dp[i] = bri[i].h; for(i = 1; i < index_bri; i++){ for(j = 0; j < i; j++){ if(bri[j].l < bri[i].l && bri[j].w < bri[i].w && dp[j] + bri[i].h > dp[i]){ dp[i] = dp[j] + bri[i].h; if(dp[i] > max) max = dp[i]; } } } cout<<"Case "<<++iCase<<": maximum height = "<<max<<endl; } return 0; }