# 題目: UVa 11456 - Trainsorting
# 題目說明
一節車廂可以選擇放在火車頭或火車尾
車廂必須按照重量由重到輕從火車頭開始排列
你需要找到最多能連接幾節車廂
INPUT:
第一行有一個整數 S
,代表測資數
每筆測資第一行有一個整數 N
,代表車廂數
接下來 N
行,每行有一個整數,代表車廂的重量
OUTPUT:
輸出最多能連接幾節車廂
# 解題方法
這是 Longest Increasing Subsequence
( 最長遞增子序列
) 的問題
由於車廂可以排在前後,所以我們將輸入的資料複製一份顛倒放在前面
例如:
N = 3
1 2 3
則排成: 3 2 1 1 2 3
接著透過 dp
找到最長遞增子序列
# 參考程式碼
#include <iostream> | |
#include <vector> | |
using namespace std; | |
int main() | |
{ | |
ios::sync_with_stdio(false); | |
cin.tie(nullptr); | |
cout.tie(nullptr); | |
int S, N, a, ans; | |
vector<int> train; | |
vector<int> len; | |
cin >> S; | |
while (S-- && cin >> N) | |
{ | |
train.assign(N * 2, 0); | |
len.assign(N * 2, 1); | |
ans = 0; | |
for (int i = 0; i < N; ++i) | |
{ | |
cin >> a; | |
train[N + i] = train[N - i - 1] = a; | |
} | |
for (int i = 0; i < N * 2; ++i) for (int j = 0; j < i; ++j) | |
{ | |
if (train[i] > train[j]) len[i] = max(len[i], len[j] + 1); | |
ans = max(ans, len[i]); | |
} | |
cout << ans << "\n"; | |
} | |
return 0; | |
} |
# 參考資料
https://ithelp.ithome.com.tw/articles/10253577
https://www.youtube.com/watch?v=fV-TF4OvZpk
http://naivered.github.io/2018/03/04/Problem_Solving/UVa/UVa-11456-Trainsorting/