直接寫中文了node
Problem Statementc++
Input測試
Outputspa
對於每組測試數據,輸出最大高度。格式:Case 第幾組數據: maximum height = 最大高度.net
Sample Input 設計
110 20 30
2
6 8 10
5 5 5
7
1 1 1
2 2 2
3 3 3
4 4 4
5 5 5
6 6 6
7 7 7
5
31 41 59
26 53 58
97 93 23
84 62 64
33 83 27
0
Sample Output code
Case 1: maximum height = 40Case 2: maximum height = 21
Case 3: maximum height = 28
Case 4: maximum height = 342
題目連接:blog
https://vjudge.net/problem/HDU-1069
排序
一塊磚頭有6種方式去擺放(1,2,3)(1,3,2)(2,1,3)(2,3,1)(3,1,2)(3,2,1)ci
上面的磚頭長(l) ,寬(s)必須分別小於下面的
dp[i]爲第i個磚頭是最下面的那個磚頭時候 能夠達到的最大高度
AC代碼
#include <bits/stdc++.h> #define Mod 1000000007 #define eps 1e-6 #define ll long long #define INF 0x3f3f3f3f #define MEM(x, y) memset(x, y, sizeof(x)) #define Maxn 1000 using namespace std; struct node { int l,s,h;//長 寬 高 node(int l,int s,int h):l(l),s(s),h(h) {} bool operator<(const node &c)const//從小到大排序 { if(l==c.l) return s<c.s; return l<c.l; } }; vector<node> v; int dp[Maxn]; int main() { int n,k=0; while(cin>>n&&n!=0) { k++; v.clear();//清空,初始化 MEM(dp,0); int cnt=0; int a,b,c; for(int i=0; i<n; i++) { cin>>a>>b>>c;//依次存入 v.push_back(node(a,b,c)); v.push_back(node(a,c,b)); v.push_back(node(b,a,c)); v.push_back(node(b,c,a)); v.push_back(node(c,b,a)); v.push_back(node(c,a,b)); } sort(v.begin(),v.end());//排序 int ans=0; for(int i=0; i<v.size(); i++)//從最小的那塊磚開始 { dp[i]=v[i].h;//一開始以就這一塊磚頭,dp[i]=v[i].h for(int j=i-1; j>=0; j--)//開始往上找比它小的磚頭 { //第j塊磚頭的長、寬分別比第i塊小,且以第j塊磚頭爲底層的高度+第i塊磚的高度 大於 以第i塊磚爲底層的高度,則更新dp[i] if(v[j].l<v[i].l&&v[j].s<v[i].s&&dp[j]+v[i].h>dp[i]) dp[i]=dp[j]+v[i].h; } if(dp[i]>ans) ans=dp[i]; } cout<<"Case "<<k<<": maximum height = "<<ans<<endl; } return 0; }