题意:
有n(n<=30)种立方体,每种都有无穷多个。要求选一些立方体;摞成一根尽量高的柱子(可以自行选择哪一条作为高), 使得每个立方体的底面长宽分别严格小于它下方立方体的地面长宽,求最高高度。
解题思路
就是DAG上的动态规划,各个立方体之间成有向图,求最长路。
注意:这题有个细节一个样例能形成三个图形
如:10,20,30 可形成 (10,20,30) (10,30,20) (30,20,10) 长宽位置无所谓因为可以旋转,由高来判断不同立方体
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Max(a,b) (a)>(b)?(a):(b)
//一个样例可构造三种立方体
//如:10,20,30 可形成 (10,20,30) (10,30,20) (30,20,10) 长宽位置无所谓因为可以旋转,由高来判断不同立方体
int d[103];
typedef struct
{
int x;
int y;
int h;
}Cube; //构建立方体
int dp(Cube c[],int i,int n)
{
int *ans=&d[i],j;
if(*ans>0) return *ans;
*ans=c[i].h; //若是没有下个相连它还有自己的高度
for(j=0;j<n;j++)
if(j!=i)
{
if(c[j].x<c[i].x && c[j].y<c[i].y || c[j].x<c[i].y && c[j].y<c[i].x)
*ans=Max(*ans,dp(c,j,n)+c[i].h);
}
return *ans;
}
int main()
{
int n,i;
while(~scanf("%d",&n) && n!=0)
{
Cube c[103];
int ans=0;
memset(d,0,103*sizeof(int));
int x,y,h,count=0;
for(i=0;i<n;i++)
{
scanf("%d%d%d",&x,&y,&h);
c[count].x=x;
c[count].y=y;
c[count++].h=h;
c[count].x=h;
c[count].y=x;
c[count++].h=y;
c[count].x=y;
c[count].y=h;
c[count++].h=x;
}
for(i=0;i<count;i++)
ans=Max(ans,dp(c,i,count));
printf("%d\n",ans);
}
return 0;
}
测试: