10066 - The Twin Towers

本文介绍了一种使用动态规划解决特定最长路径问题的方法。该问题要求根据大象的体重和智力找到一条特殊的最长路径并输出。通过先排序再利用动态规划算法求解最长上升子序列,实现了问题的有效解决。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Difficulty: middle

Algorithms: Dynamic Programming

Source:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=114&page=show_problem&problem=1007

Description: 题目的要求是让大象的体重从小到大排,而智力从大到小排,输出这样的最长的路径,并打印路径。首先先对体重从大到小排序,然后再依照智力找最长的路径,实际上就变成了最长上升子序列,经典的动态规划

 

#include<iostream>

#include<algorithm>

#include<cstdio>

#include<cstring>

using namespace std;

int d[1010];

struct Node{

    int weight;

    int iq;

    int num;

};

Node node[1010];

 

int cmp(Node a, Node b)

{

    if(a.weight == b.weight)

        return a.iq < b.iq;

    else return a.weight > b.weight;

}

 

int dp(int i)

{

    if(d[i] != -1)

        return d[i];

    d[i] = 1;

    int temp;

    for(int j = 0; j < i; j++){

        if(node[j].iq < node[i].iq && node[j].weight > node[i].weight){

            temp = dp(j) + 1;

            if(d[i] < temp){

                d[i] = temp;

            }

        }

    }

    return d[i];

}

 

int main()

{

    int i, j, k;

    int n = 0;

    //freopen("input.txt", "r", stdin);

    while(cin>>node[n].weight>>node[n].iq){

        n++;

        node[n - 1].num = n;

    }

    sort(node, node + n, cmp);

    memset(d, -1, sizeof(d));

    j = 0;

    for(i = 0; i < n; i++){

        if(j < dp(i)){

            j = d[i];

            k = i;

        }

    }

    cout<<j<<endl;

    for(k; k >= 0; k--){

        if(d[k] == j){

            cout<<node[k].num<<endl;

            j--;

        }

    }

    return 0;

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值