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

    是一道归根于最长上升子序列的问题,权值1改为高度h,因为要求最大上升子序列,要先排序,这里按面积升序排序,使后面的面积大的block不会叠在前面面积小的block之上,便于递推,这里用qsort排序方便很多。

    代码如下:

    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    int n, x[95], y[95], h[95], f[95], r[95];
    int cmp(const void *_p, const void *_q)
    {
    int *p = (int *)_p;
    int *q = (int *)_q;
    return (x[*p] * y[*p]) - (x[*q] * y[*q]);
    }
    void solve()
    {
    memset(f,0,sizeof(f));
    for(int i = 1; i <= 3*n; i ++)
    for(int j = i; j <= 3*n; j ++)
    if((x[r[i]]<x[r[j]]&&y[r[i]]<y[r[j]])||(x[r[i]]<y[r[j]]&&y[r[i]]<x[r[j]]))
    {
    if(f[j] < f[i] + h[r[i]])
    f[j] = f[i] + h[r[i]];
    }
    int max = 0;
    for(int i = 1; i <= 3*n; i ++)
    if(f[i]+h[r[i]] > max) max = f[i] + h[r[i]];
    printf("%d\n",max);
    }
    void input()
    {
    int num = 0;
    while(scanf("%d",&n) == 1)
    {
    if(n == 0) break;
    for(int i = 1,j = 1; i <= n; i ++, j += 3)
    {
    scanf("%d%d%d",&x[j], &y[j], &h[j]);
    h[j+1] = x[j];
    x[j+1] = h[j];
    y[j+1] = y[j];
    h[j+2] = y[j];
    x[j+2] = x[j];
    y[j+2] = h[j];
    }
    num ++;
    for(int i = 0; i <= 3*n; i ++)
    r[i] = i;
    qsort(r+1,3*n,sizeof(r[1]),cmp);
    printf("Case %d: maximum height = ",num);
    solve();
    }
    }
    int main()
    {
    input();
    return 0;
    }



  • 相关阅读:
    Linux 4.11 内核变化
    c++设计模式
    【MySQL】undo,redo,2PC,恢复思维导图
    10053
    深入理解MySQL中的Redo、Undo、MVCC
    oracle 博客精选
    Linux内存中的Cache真的能被回收么?
    MySQL性能指标及计算方法 等待show processlist
    HTTP抓包工具Fiddler
    科来网络分析
  • 原文地址:https://www.cnblogs.com/yuzhaoxin/p/2410755.html
Copyright © 2011-2022 走看看