1.题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19214
2.该图属于DAG模型,建图,然后对每个点跑一篇最长路取最大即可。对于多决策问题,且每一个的当前状态由前一个状态影响,我们可以用dp的思想。先求出状态方程,然后用DAG或者刷表发更新出来。
AC:
#include <algorithm>
#include <string>
#include <iostream>
#include <string.h>
#include<stdio.h>
#include<cmath>
#include<vector>
using namespace std;
#define ll long long int
#define debug
const int maxn=1212;
struct ss
{
int x,y,z;
}st[3*maxn];
int dp[3*maxn],mp[3*maxn][3*maxn],an;
int a,b,c,cnt=0;
int dag(int i)
{
int &ans=dp[i];
if(ans>0) return ans;
ans=st[i].z;
for(int j=0;j<cnt;j++)
{
if(mp[i][j]) ans=max(ans,dag(j)+st[i].z);
}
return ans;
}
int main()
{
//freopen("in.txt","r",stdin);
int n;
int kase=0;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
cnt=0;
memset(dp,0,sizeof dp);
memset(mp,0,sizeof mp);
for(int i=0;i<n;i++)
{
scanf("%d%d%d",&a,&b,&c);
st[cnt].x=max(a,b); st[cnt].y=min(a,b); st[cnt++].z=c;
st[cnt].x=max(a,c); st[cnt].y=min(a,c); st[cnt++].z=b;
st[cnt].x=max(c,b); st[cnt].y=min(c,b); st[cnt++].z=a;
}
for(int i=0;i<cnt;i++)
{
for(int j=0;j<cnt;j++)
{
if(st[i].x>st[j].x&&st[i].y>st[j].y) mp[i][j]=1;
}
}
an=0;
dag(0);
for(int i=0;i<cnt;i++)
{
an=max(an,dag(i));
}
printf("Case %d: maximum height = %d\n",++kase,an);
}
return 0;
}