有大佬能给个正确性证明吗,乱搞做法竟然过了我也很蒙。。。
#include <bits/stdc++.h>
#define pii pair<int,int>
#define mp_ make_pair
#define fst first
#define snd second
#define debug cout<<"\n*******\n";
const int INF = 0x3f3f3f3f;
using namespace std;
int sq[35][3];
int ans[35][3];
inline pii getP(int a){
pii ans;
if(a==0) ans = mp_(1,2);
else if(a==1) ans = mp_(0,2);
else ans = mp_(0,1);
return ans;
}
int main(){
int n,cnt = 1;
while(cin>>n && n){
sq[0][0] = INF;sq[0][1] = INF;sq[0][2] = INF;
for(int i=1;i<=n;i++) cin>>sq[i][0]>>sq[i][1]>>sq[i][2];
memset(ans,0,sizeof(ans));
for(int i=1;i<=n;i++){
for(int j=0;j<=2;j++){
ans[i][j] = sq[i][j];
}
}
for(int j=1;j<=n*n;j++){
for(int sa=1;sa<=n;sa++){
for(int pi=0;pi<=2;pi++){
for(int sb=1;sb<=n;sb++){
for(int pj=0;pj<=2;pj++){
int a_p1 = getP(pi).fst;int a_p2 = getP(pi).snd;
int b_p1 = getP(pj).fst;int b_p2 = getP(pj).snd;
if(sq[sa][a_p1]<sq[sb][b_p1] && sq[sa][a_p2]<sq[sb][b_p2] || sq[sa][a_p2]<sq[sb][b_p1] && sq[sa][a_p1]<sq[sb][b_p2]){
//在sa以pi号边为高,sb以pj号边为高时,正方体sa可以叠在sb上
ans[sa][pi] = max(ans[sa][pi],ans[sb][pj]+sq[sa][pi]);
}
// cout << sa << " " << pi << " " << sb << " " << pj << " " << ans[sa][pi] << "\n";
}
}
}
}
}
int maxans = 0;
for(int i=1;i<=n;i++){
for(int j=0;j<=2;j++){
maxans = max(maxans,ans[i][j]);
}
}
cout << "Case " << cnt << ": maximum height = " << maxans << "\n";
cnt++;
}
}