例题9-2 UVa 437 (HDU 1069)

来源:互联网 发布:ios10 数据开关 编辑:程序博客网 时间:2024/05/19 21:00
/*基础dpUVa 437 The Tower of BabylonC - Monkey and Banana时间: 2017/02/20题意:叠放立方体,使其叠的高度最大。在按底的长宽排序后,进行求最大子序列和题解:1. 在按底的长宽排序后,进行求最大子序列和2. 类似嵌套问题,记忆化搜索*/#include<cstdio>#include<cstring>#include<cmath>#include<iostream>#include<algorithm>#include<queue>#include<map>using namespace std;#define N 210#define INF 0x3f3f3f3f//1 ------------------------------struct code{    int x,y,z;}f[200];bool cmp(code a,code b){    if(a.x != b.x)        return a.x > b.x;    return a.y > b.y;}int main(){    int n;    int k = 0;    while(~scanf("%d",&n)&&n)    {        k++;        int n1 = n;        int i = 0;        while(n1--)        {            int a[3];            scanf("%d%d%d",&a[0],&a[1],&a[2]);            sort(a,a+3);            f[i].y = f[i+1].z = f[i+2].x = a[1];            f[i].x = f[i+1].x = f[i+2].z = a[2];            f[i].z = f[i+1].y = f[i+2].y = a[0];            i += 3;        }        sort(f,f+3*n,cmp);        int dp[200];        int maxn=0;        for(i=0;i<3*n;i++)        {            dp[i] = f[i].z;            for(int j = i-1; j >=0; j--)            {                if(f[j].x > f[i].x && f[j].y > f[i].y)                {                    if(dp[i] < dp[j] + f[i].z)                        dp[i] = dp[j] + f[i].z;                }            }            if(dp[i] > maxn)                maxn = dp[i];        }        printf("Case %d: maximum height = %d\n",k,maxn);    }    return 0;}//2 ------------------------------struct code{    int x,y,z;}f[N];int mp[N][N],dp[N];int n;int dfs(int i){    int &ans = dp[i];    if(ans > 0) return ans;    ans = f[i].z;    for(int j = 0; j < 3*n; j++)    {        if(mp[i][j])            ans = max(ans, dfs(j)+f[i].z);    }    return ans;}int main(){    int k = 0;    while(~scanf("%d",&n)&&n)    {        k++;        int n1 = n;        int i = 0;        while(n1--)        {            int a[3];            scanf("%d%d%d",&a[0],&a[1],&a[2]);            sort(a,a+3);            f[i].y = f[i+1].z = f[i+2].x = a[1];            f[i].x = f[i+1].x = f[i+2].z = a[2];            f[i].z = f[i+1].y = f[i+2].y = a[0];            i += 3;        }        memset(mp,0,sizeof(mp));        memset(dp,0,sizeof(dp));        for(int i = 0; i < 3*n; i++)        {            for(int j = 0; j < 3*n; j++)            {                if(f[i].x < f[j].x && f[i].y < f[j].y)                    mp[i][j] = 1;            }        }        int maxn = 0;        for(int i = 0; i < 3*n; i++)        {            maxn = max(maxn,dfs(i));        }        printf("Case %d: maximum height = %d\n",k,maxn);    }    return 0;}


0 0
原创粉丝点击