您的位置:首页 > 大数据 > 人工智能

UVa 11456 - Trainsorting

2016-08-05 13:25 513 查看
題目:有一列車運送過來,初始隊列為空,每次可以把車放在隊首或者隊尾或者丟棄,

            必須保證重量是遞增的,求最長的隊列長度。

分析:dp,lis。合唱隊形類似物。

            首先,將已知串從後向前沒計算最大上升子序列和最大下降子序列;

            然後,枚舉加和的最大值-1(自己出現兩次)即可。

說明:不要從前往後算,含義不同。

#include <cstdlib>
#include <cstring>
#include <cstdio>

int data[2002];
int begin[2002];
int end[2002];

int main()
{
int t, n;
while (~scanf("%d",&t)) {
while (t --) {
scanf("%d",&n);
for (int i = 1; i <= n; ++ i) {
scanf("%d",&data[i]);
}
int ans = 0;
for (int i = n; i >= 1; -- i) {
begin[i] = 1;
end[i] = 1;
for (int j = n; j > i; -- j) {
if (data[i] < data[j] && begin[i] <= begin[j]) {
begin[i] = begin[j]+1;
}
if (data[i] > data[j] && end[i] <= end[j]) {
end[i] = end[j]+1;
}
}
if (ans < begin[i]+end[i]-1) {
ans = begin[i]+end[i]-1;
}
}
printf("%d\n",ans);
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: