标签:
Description
Input
Output
Sample Input
Sample Output
#include <iostream> #include <cstring> #include <algorithm> using namespace std; struct node { int x,y,z; void getdata(int a,int b,int c) { x=a; y=b; z=c; } }v[185]; int max(int x,int y) { return x>y?x:y; } bool fun(node a,node b)//排序 { if(a.x!=b.x) return a.x>b.x; return a.y>b.y; } int main() { int n,i,f,j,a,b,c,ff=1,sum; while(cin>>n&&n) { f=1; v[0].x=v[0].y=1000000000;//为了保证下面的dp每次都能被更新一次 for(i=1;i<=n;i++) { cin>>a>>b>>c; v[f++].getdata(a,b,c);//因为有很多个这样的矩形,所以一个个列举出来 v[f++].getdata(a,c,b);// v[f++].getdata(c,a,b);// v[f++].getdata(c,b,a);// v[f++].getdata(b,a,c);// v[f++].getdata(b,c,a);// } sort(v,v+f,fun); int s=0; int dp[185]; memset(dp,0,sizeof(dp)); for(i=1;i<f;i++) { for(j=0;j<=i;j++)//j从0开始是因为v[0].x=v[0].y=1000000000 这样可以使的dp在不断的更新 { if((v[j].x>v[i].x&&v[j].y>v[i].y)&&dp[j]+v[i].z>dp[i])//状态转移方程为h[i]=max{h[j]+第i个砖块的高度,j<i}, { dp[i]=dp[j]+v[i].z; } s=max(dp[i],s); } sum=s; } cout<<"Case "<<ff++<<": maximum height = "<<s<<endl; } return 0; }
标签:
原文地址:http://www.cnblogs.com/xinxiangqing/p/4741552.html