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;
}
必須保證重量是遞增的,求最長的隊列長度。
分析: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;
}
相关文章推荐
- uva 11456 - Trainsorting(LIS)
- uva11456——Trainsorting(LIS)
- UVa 11456 - Trainsorting
- 【UVa】11456 - Trainsorting
- Uva 11456 - Trainsorting
- uva 11456 - Trainsorting(dp,LIS)
- UVA 11456 - Trainsorting(DP + LIS)
- UVA 11456 - Trainsorting(LIS)
- uva 11456
- UVA11456--dp,LIS
- UVA - 11456 Trainsorting DP
- 动态规划intermediate:UVa 11456
- uva 10806
- uva 120 Stacks of Flapjacks(检索)
- uva 11235
- UVA 11136 Hoax or what (multiset)
- uva 10319 - Manhattan (2SAT)
- 买还是建buy or build,uva1151——最小生成树,Kruskal,枚举子集
- Uva - 10763 - Foreign Exchange
- UVa10817