刚开始竟然看错题目了 结果经让做对了!!!!
#include <stdio.h>
#include <string.h>
#define q(i) ((i+2)%3)
#define h(i) ((i+1)%3)
int solve(int,int,int n,int [][3][n][3],int[][3],int[][3]);
int max(int,int);
int is_ok(int,int,int[],int[]);
void solve_mark(int n,int[][3],int[][3][n][3]);
int main(void)
{
int n,cs = 0;
while(scanf("%d",&n)&&n)
{
int sz[n][3],i,j;
for(i = 0;i < n;i++){
scanf("%d%d%d",sz[i],sz[i]+1,sz[i]+2);
}
int mark[n][3][n][3],ans = 0,dg[n][3];
memset(mark,0,sizeof(mark));memset(dg,-1,sizeof(dg));
solve_mark(n,sz,mark);
for(i = 0;i < n;i++){
for(j = 0;j < 3;j++){
ans = max(ans,solve(i,j,n,mark,sz,dg));
}
}
cs++;
printf("Case %d: maximum height = %d\n",cs,ans);
}
return 0;
}
int solve(int dq,int dqh,int n,int mark[][3][n][3],int sz[][3],int dg[][3])
{
if(dg[dq][dqh] != -1) return dg[dq][dqh];
int i,j;
dg[dq][dqh] = sz[dq][dqh];
for(i = 0;i < n;i++){
for(j = 0;j < 3;j++){
if(mark[dq][dqh][i][j]){
dg[dq][dqh] = max(dg[dq][dqh],sz[dq][dqh]+solve(i,j,n,mark,sz,dg));
}
}
}
return dg[dq][dqh];
}
int max(int a,int b)
{
return a > b ? a:b;
}
int is_ok(int i,int k,int sz_i[],int sz_k[])
{
if(sz_i[q(i)] > sz_k[q(k)] && sz_i[h(i)] > sz_k[h(k)]) return 1;
if(sz_i[q(i)] > sz_k[h(k)] && sz_i[h(i)] > sz_k[q(k)]) return 1;
return 0;
}
void solve_mark(int n,int sz[][3],int mark[][3][n][3])
{
int i,j,k,l;
for(i = 0;i < n;i++){
for(j = 0;j < 3;j++){
for(k = 0;k < n;k++){
for(l = 0;l < 3;l++){
if(is_ok(j,l,sz[i],sz[k])) mark[i][j][k][l] = 1;
}
}
}
}
}