DGA最长路问题
#include<iostream>
#include<string.h>
#include <sstream>
using namespace std;
int typeNum;
int** blos;
int** d;
int count=0;
string s="";
void fun(int i,int a,int b,int c)
{
if(a>b){
int t=a;a=b;b=t;
}
if(b>c){
int t=b;b=c;c=t;
}
if(a>b){
int t=a;a=b;b=t;
}
blos[i][1]=a;blos[i][2]=b;blos[i][3]=c;
}
bool judge(int i,int j,int k,int l)
{
int b1,b2,c1,c2;
if(j==1)
{b1=blos[i][2];b2=blos[i][3];}
else if(j==2)
{b1=blos[i][1];b2=blos[i][3];}
else
{b1=blos[i][1];b2=blos[i][2];}
if(l==1)
{c1=blos[k][2];c2=blos[k][3];}
else if(l==2)
{c1=blos[k][1];c2=blos[k][3];}
else
{c1=blos[k][1];c2=blos[k][2]; }
if(c1<b1&&c2<b2)
return true;
return false;
}
int fun1(int i,int j)
{
int& ans=d[i][j];
int maxx=0;
if(ans==0)
{
for(int k=1;k<=typeNum;k++)
for(int l=1;l<=3;l++)
if(judge(i,j,k,l))
{
maxx=max(maxx,fun1(k,l));
}
ans=blos[i][j]+maxx;
}
return ans;
}
void function(int typeNum)
{
blos=new int*[typeNum+1];
for(int i=1;i<=typeNum;i++)
blos[i]=new int[4];
int a,b,c;
for(int i=1;i<=typeNum;i++)
{
cin>>a>>b>>c;
fun(i,a,b,c);
}
d=new int*[typeNum+1];
for(int i=1;i<=typeNum;i++)
{
d[i]=new int[4]();
}
int maxx=0;
for(int i=1;i<=typeNum;i++)
for(int j=1;j<=3;j++)
maxx=max(maxx,fun1(i,j));
count++;
ostringstream oss;
oss<<"Case "<<count<<": maximum height = "<<maxx<<"\n";
s+=oss.str();
}
int main()
{
cin>>typeNum;
while(typeNum!=0)
{
function(typeNum);cin>>typeNum;}
cout<<s;
}