zoukankan      html  css  js  c++  java
  • UVA 437 The Tower of Babylon

    UVA_437

        首先将一个长方体变成3个来存储,然后按底面积的大小升序排列,最后求一个最长上升子序列即可。

    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define MAXD 110
    int N, f[MAXD], a[5][MAXD], r[MAXD];
    int cmp(const void *_p, const void *_q)
    {
    int *p = (int *)_p;
    int *q = (int *)_q;
    return a[0][*p] * a[1][*p] - a[0][*q] * a[1][*q];
    }
    int init()
    {
    int i;
    scanf("%d", &N);
    if(!N)
    return 0;
    N *= 3;
    for(i = 0; i < N; i ++)
    {
    scanf("%d%d%d", &a[0][i], &a[1][i], &a[2][i]);
    i ++;
    a[2][i] = a[0][i - 1], a[0][i] = a[1][i - 1], a[1][i] = a[2][i - 1];
    i ++;
    a[2][i] = a[0][i - 1], a[0][i] = a[1][i - 1], a[1][i] = a[2][i - 1];
    }
    return 1;
    }
    void solve()
    {
    int i, j, ri, rj, temp, max;
    for(i = 0; i < N; i ++)
    r[i] = i;
    qsort(r, N, sizeof(r[0]), cmp);
    for(i = 0; i < N; i ++)
    f[i] = a[2][r[i]];
    for(i = 1; i < N; i ++)
    {
    ri = r[i];
    for(j = 0; j < i; j ++)
    {
    rj = r[j];
    if((a[0][rj] < a[0][ri] && a[1][rj] < a[1][ri]) || (a[0][rj] < a[1][ri] && a[1][rj] < a[0][ri]))
    {
    temp = f[j] + a[2][ri];
    if(temp > f[i])
    f[i] = temp;
    }
    }
    }
    max = 0;
    for(i = 0; i < N; i ++)
    if(f[i] > max)
    max = f[i];
    printf("%d\n", max);
    }
    int main()
    {
    int t = 0;
    while(init())
    {
    printf("Case %d: maximum height = ", ++ t);
    solve();
    }
    return 0;
    }


  • 相关阅读:
    Android 控件的学习
    Java并发编程
    Glide的学习之路
    插件化和热修复学习之路
    OkHttp的学习
    WMS的学习
    app一点一滴的学习
    进程启动学习
    View学习之解决滑动冲突
    应用学习
  • 原文地址:https://www.cnblogs.com/staginner/p/2238428.html
Copyright © 2011-2022 走看看