/*SE:wn------王宁*/
刘汝佳大神源码 && 我的AC代码(可能更简洁易懂)+ 我的前期思路、解说和总结 &&我前期的失败代码
// Rujia Liu
#include
#include
#include
using namespace std;
#define REP(i,n) for(int i = 0; i < (n); i++)
const int maxn = 30 + 5;
int n, blocks[maxn][3], d[maxn][3];
void get_dimensions(int* v, int b, int dim) {
int idx = 0;
REP(i,3) if(i != dim) v[idx++] = blocks[b][i];
}
int dp(int i, int j) {
int& ans = d[i][j];
if(ans > 0) return ans;
ans = 0;
int v[2], v2[2];
get_dimensions(v, i, j);
REP(a,n) REP(b,3) {
get_dimensions(v2, a, b);
if(v2[0] < v[0] && v2[1] < v[1]) ans = max(ans, dp(a,b));
}
ans += blocks[i][j];
return ans;
}
int main() {
int kase = 0;
while(scanf("%d", &n) == 1 && n) {
REP(i,n) {
REP(j,3) scanf("%d", &blocks[i][j]);
sort(blocks[i], blocks[i]+3);
}
memset(d, 0, sizeof(d));
int ans = 0;
REP(i,n) REP(j,3) ans = max(ans, dp(i,j));
printf("Case %d: maximum height = %d\n", ++kase, ans);
}
return 0;
}
/*SE:wn------王宁*/
/*------------失败的思路如下,失败的代码会放在最后面
让我们一起想想想,
让我们一起想想想~
首先,放在最上面的应该是让最小的两条边作为底座
让最长的那条边作为高,因为是最上面不需要再放东西了
否则,底变大,高变小,绝对划不来
所以是否可以将所有的x,y,z排好序?
x
using namespace std;
const int maxn=35;
typedef struct info{
int x,y,z;
}block;
vector v;
int dp[3*maxn];
bool vis[3*maxn];
int n;
int deepmind(int i){
if(vis[i]) return dp[i];
else{
vis[i]=1;
for(int j=0;j<3*n;j++){
if(v[j].x
失败的版本:
#include
using namespace std;
const int maxn=35;
typedef struct Info{
int x,y,z;
bool operator < (const Info &a) const{
if(a.y != y)
return a.y < y ;
if(a.x != x)
return a.x < x ;
}
}block;
int main()
{
int n,i,j,magic,a[3],sum;
priority_queue pq;
block b,cmp,t;
while(~scanf("%d",&n)&&n){
for(i=1;i<=n;i++){
scanf("%d%d%d",&a[0],&a[1],&a[2]);
sort(a,a+3);
t.x=a[0]; t.y=a[1]; t.z=a[2]; pq.push(t);
t.x=a[0]; t.y=a[2]; t.z=a[1]; pq.push(t);
t.x=a[1]; t.y=a[2]; t.z=a[0]; pq.push(t);
}
printf("最顶上的这块砖x y z 分别等于%d %d %d\n",pq.top().x,pq.top().y,pq.top().z);
sum=pq.top().z; cmp=pq.top(); pq.pop();
while(!pq.empty()){
b=pq.top(); pq.pop();
printf("现在的这块砖x y z 分别等于%d %d %d\n",b.x,b.y,b.z);
if(b.x>cmp.x&&b.y>cmp.y) {sum+=b.z; cmp=b;}
}
printf("%d\n",sum);
}
return 0;
}