题目比较长但是方法非常简单,就是求最长非升子序列。直接上代码。。。。
代码:
#include<iostream>
#include<algorithm>
using namespace std;
int dp[5000];
int num[5000];
const int inf = 0x3f3f3f3f;
int main() {
int temp, Case = 0;
int index = 0;
while (cin >> temp, temp != -1) {
num[index++] = temp;
while (cin >> temp, temp != -1) {
num[index++] = temp;
}
memset(dp, 0, sizeof(dp));
int top = 0;
dp[top] = inf;
for (int i = 0; i < index; ++i) {
if (dp[top] >= num[i]) {
dp[++top] = num[i];
}
else {
int low = 1, high = top;
while (low <= high) {
int mid = (low + high) >> 1;
if (dp[mid] > num[i]) {
low = mid + 1;
}
else {
high = mid - 1;
}
}
dp[low] = num[i];
}
}
cout << "Test #" << ++Case << ":" << endl;
cout << " maximum possible interceptions: " << top << endl;
cout << endl;
index = 0;
}
}
#include<iostream>
#include<algorithm>
using namespace std;
int dp[5000];
int num[5000];
const int inf = 0x3f3f3f3f;
int main() {
int temp, Case = 0;
int index = 0;
while (cin >> temp, temp != -1) {
num[index++] = temp;
while (cin >> temp, temp != -1) {
num[index++] = temp;
}
for (int i = 0; i<index; i++)
{
dp[i] = 1;
for (int j = 0; j<i; j++)
{
if (num[j] >= num[i])
dp[i] = max(dp[i], dp[j] + 1);
}
}
int maxv = 0;
for (int i = 0; i<index; i++)
{
if (dp[i]>maxv)
maxv = dp[i];
}
cout << "Test #" << ++Case <<":"<< endl;
cout << " maximum possible interceptions: " << maxv << endl;
cout << endl;
index = 0;
}
}