【UVa】11456 - Trainsorting

本文介绍了一个经典的编程问题——如何在给定一系列列车车厢重量的情况下,通过仅允许在列车首尾添加车厢的操作,构造出最长的按重量递减顺序排列的列车。文章提供了完整的算法思路及C++实现代码。

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

Problem here

Problem

Erin is an engineer. She drives trains. She also arranges the cars within each train. She prefers to
put the cars in decreasing order of weight, with the heaviest car at the front of the train.
Unfortunately, sorting train cars is not easy. One cannot simply pick up a car and place it somewhere
else. It is impractical to insert a car within an existing train. A car may only be added to the beginning
and end of the train.
Cars arrive at the train station in a predetermined order. When each car arrives, Erin can add it
to the beginning or end of her train, or refuse to add it at all. The resulting train should be as long as
possible, but the cars within it must be ordered by weight.
Given the weights of the cars in the order in which they arrive, what is the longest train that Erin
can make?

INPUT

The first line is the number of test cases to follow. The test cases follow, one after another; the format
of each test case is the following:
The first line contains an integer 0 ≤ n ≤ 2000, the number of cars. Each of the following n lines
contains a non-negative integer giving the weight of a car. No two cars have the same weight.

OUTPUT

Output a single integer giving the number of cars in the longest train that can be made with the given
restrictions.

SAMPLE

input

1
3
1
2
3

output

3

Solution

LIS + LDS -1
這裡-1因為LIS和LDS的起點會重複

#include <iostream>
#include <vector>
#include "memory.h"
using namespace std;

int train[2000];
int len[2000];
int len2[2000];
int tn;

int main(){
    int t;
    while(cin >> t){
        while(t--){
            cin >> tn;
            for(int i = tn-1; i >= 0; i--){
                len[i] = 1;
                len2[i] = 1;
                int tmp;
                cin >> tmp;
                train[i] = tmp;
            }
            for(int i = 0; i < tn; i++){
                for(int j = i+1; j < tn; j++){
                    if(train[i] < train[j]){
                        len[j] = max(len[j], len[i]+1);
                    }
                    if(train[i] > train[j]){
                        len2[j] = max(len2[j], len2[i]+1);
                    }
                }
            }
            int result = 0;
            for(int i = 0; i < tn; i++){
                result = max(result, len[i]+len2[i]-1);
            }
            cout << result << endl;
        }
    }

    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值