C - Monkey and Banana
思路:对于这道DP题来说,如果以高度或者说砖块的个数来作为储存的状态的内容,显然是不合适的。
不难看出,这道题主要是想求一个最长有序子序列,那么我们首先把所有可能的长宽高都保存起来,然后再对该数组求一个最长有序子序列即可!
只要理解了什么是最长有序子序列,那么该题便迎刃而解!
代码:
// Created by CAD on 2019/10/17. #include <bits/stdc++.h> using namespace std; struct BOX{ int x,y; int high,dp; bool operator<(BOX &b) { if(x<b.x) return true; return x==b.x && y<b.y; } }box[200]; int main() { ios::sync_with_stdio(false); cin.tie(0); int n,Case=0; while(cin>>n,n) { int cnt=0; for(int i=1;i<=n;++i) { int x,y,z; cin>>x>>y>>z; box[++cnt].x=x,box[cnt].y=y,box[cnt].high=box[cnt].dp=z; box[++cnt].x=x,box[cnt].y=z,box[cnt].high=box[cnt].dp=y; box[++cnt].x=y,box[cnt].y=x,box[cnt].high=box[cnt].dp=z; box[++cnt].x=y,box[cnt].y=z,box[cnt].high=box[cnt].dp=x; box[++cnt].x=z,box[cnt].y=x,box[cnt].high=box[cnt].dp=y; box[++cnt].x=z,box[cnt].y=y,box[cnt].high=box[cnt].dp=x; } sort(box+1,box+cnt+1); int ans=0; for(int i=1;i<=cnt;++i) for(int j=1;j<=cnt;++j) { if(box[i].x>box[j].x&&box[i].y>box[j].y) box[i].dp=max(box[j].dp+box[i].high,box[i].dp); ans=max(ans,box[i].dp); } cout<<"Case "<<++Case<<": maximum height = "<<ans<<endl; } return 0; }