zoukankan      html  css  js  c++  java
  • 暑假练习:Uva437

    题目链接:uva437

    解题思路:只有长和宽均小于下面立方体的长和宽的方块才可以放在上面。因此这是一个有序对,可以抽象成有向无环图来做。运用DAG求最长路算法来求。其中用dp[i][j]来表示第i种方块以第j种边为高时的最高高度。

    代码实例:

    #include<iostream>
    #include<cstring>
    using namespace std;
    struct Node{
    	int a[3];
    }tw[35];
    int dp[35][3];
    int G[35][3][35][3];
    int n;
    int DAG_dp(int f,int s){
    	int& ans = dp[f][s];
    	if(dp[f][s])	return dp[f][s];
    	dp[f][s] = 0;
    	int idx = f,idh = s;
    	for(int i = 0;i < n;i++)
    		for(int j = 0;j < 3;j++)
    			if(G[idx][idh][i][j]){
    				ans = max(DAG_dp(i,j),ans);
    			}
    	ans += tw[idx].a[idh];
    	return ans;
    	
    }
    int main()
    {
    	int a,b,c;
    	int kcase = 0;
    	while(cin >> n && n){
    		memset(dp,0,sizeof(dp));
    		memset(G,0,sizeof(G));
    		for(int i = 0;i < n;i++){
    			cin >> tw[i].a[0] >> tw[i].a[1] >> tw[i].a[2];
    		}
    		for(int i = 0;i < n;i++)
    			for(int j = 0;j < 3;++j)
    				for(int k = 0;k < n;k++)
    					for(int z = 0;z<3;z++){
    						if((tw[i].a[(j+2)%3] < tw[k].a[(z+2)%3] && tw[i].a[(j+1)%3] < tw[k].a[(z+1)%3])
    						|| (tw[i].a[(j+1)%3] < tw[k].a[(z+2)%3] && tw[i].a[(j+2)%3] < tw[k].a[(z+1)%3]))
    							G[i][j][k][z] = 1;
    					}
    		int maxh = -1;
    		for(int i = 0;i < n;i++)
    			for(int j = 0;j < 3;++j)
    		//	cout << DAG_dp(i,j) << " ";
    				 maxh = max(DAG_dp(i,j),maxh);
    		cout << "Case " << ++kcase << ": maximum height = " << maxh << endl;
    	}
    	return 0;
    }
  • 相关阅读:
    学习进度笔记01
    进度报表十一
    进度报表十
    进度日报九
    进度日报八
    进度日报七
    第七周总结
    进度报表六
    第一阶段冲刺6
    第一阶段冲刺5
  • 原文地址:https://www.cnblogs.com/long98/p/10352225.html
Copyright © 2011-2022 走看看