题目很绕,就是求最长下降子序列。但要注意最后一个输出行没有空行。
// File Name: UVa231.cpp
// Author: Toy
// Created Time: 2013年03月15日 星期五 15时45分09秒
#include <iostream>
#include <cstdio>
#include <cstring>
#include <vector>
#include <cctype>
#include <cmath>
#include <string>
#include <algorithm>
#include <cstdlib>
#include <iomanip>
#include <list>
#include <map>
#include <set>
#include <deque>
#include <stack>
#include <bitset>
#define L(x) x << 1
#define R(x) x << 1 | 1
using namespace std;
int A[100000], opt[100000];
int DP ( int a ) {
int Max = 1;
for ( int i = 1; i < a; ++i ) {
for ( int j = 0; j < i; ++j )
if ( A[j] >= A[i] && opt[j] >= opt[i] ) opt[i]++;
Max = ( opt[i] > Max ) ? opt[i] : Max;
}
return Max;
}
int main ( ) {
int temp, Case = 1, i, length, cmp = 1;
while ( 1 ) {
cin >> temp;
if ( temp == -1 ) break;
else if ( cmp == -1 ) printf ( "\n" );
i = 0;
length = 0;
A[i++] = temp;
while ( 1 ) {
cin >> A[i++];
if ( A[i - 1] == -1 ) {
cmp = A[i - 1];
break;
}
}
length = i - 1;
for ( i = 0; i < length; ++i ) opt[i] = 1;
cout << "Test #" << Case++ << ":" << endl;
cout << " maximum possible interceptions: " << DP ( length ) << endl;
}
return 0;
}