uva 437 (dag 最长路)

来源:互联网 发布:java jdk1.6 64位下载 编辑:程序博客网 时间:2024/05/22 13:26

题意:给出n个长方形,每个长方形都有无数多个,问怎么排列能使高度最高,最高的高度是多少? 长方形三条边的任意一条都能作为高,所以一个长方形可产生三种长方形。

然后直接用dag最长路。

#include<iostream>#include<cstdio>#include<string>#include<cstring>#include<algorithm>#include<cmath>using namespace std;#define inf 111111111int dp[200];struct node{    int l,w,h;}rec[200];int n;int ans;void init(){    memset(dp,0,sizeof(dp));    ans=0;    int a,b,c;    n*=3;    rec[0].l=rec[0].w=rec[0].h=inf;    for(int i=1;i<=n;i+=3)    {        cin>>a>>b>>c;        rec[i].l=a;rec[i].w=b;rec[i].h=c;        rec[i+1].l=b;rec[i+1].w=c;rec[i+1].h=a;        rec[i+2].l=c;rec[i+2].w=a;rec[i+2].h=b;    }}void slove(int k){    for(int i=1;i<=n;i++)    {        if(((rec[k].l>rec[i].l&&rec[k].w>rec[i].w)||            (rec[k].l>rec[i].w&&rec[k].w>rec[i].l))&&dp[i]<dp[k]+rec[i].h)        {            dp[i]=dp[k]+rec[i].h;            slove(i);        }    }    if(ans<dp[k])        ans=dp[k];}int main(){    int cas=0;    while(cin>>n)    {        cas++;        if(n==0)            break;        init();        slove(0);        printf("Case %d: maximum height = %d\n",cas,ans);    }    return 0;}


 

原创粉丝点击