第九章例题 B - The Tower of Babylon UVA - 437

/*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;
}

 

你可能感兴趣的:(八月暑期集训)