我一直在尝试在O(n logn)中解决欺骗问题CODERE3(链接:http://www.spoj.com/problems/CODERE3/)。问题基本上是最长的比特子序列。我不断获得WA,我无法理解我的代码中的问题在哪里。逻辑并不复杂,只需将长度为i的子序列的最后一个元素保留在索引i中,而我只保留该长度的最佳解决方案(我保持最小的数字,即可能是长度序列i)的最后一个元素。希望你能帮助我解决我的问题,因为我没有真正有效解释为什么我要获得西澳大利亚州。而且,这是我的代码。
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
int a[2][1005], naj[2][1005], kum[2][1005];
vector<int> v[2];
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--)
{
int n;
cin >> n;
for (int i = 0; i < n; ++i)
{
cin >> a[0][i];
a[1][n - i - 1] = a[0][i];
}
for (int i = 0; i < 2; ++i)
{
int vel = 1;
v[i].push_back(a[i][0]);
naj[i][1] = kum[i][1] = 1;
for (int j = 1; j < n; ++j)
{
if (a[i][j] < v[i][0])
{
v[i][0] = a[i][j];
}
else if (a[i][j] > v[i][vel - 1])
{
v[i].push_back(a[i][j]);
naj[i][j + 1] = ++vel;
}
else
{
int idx = lower_bound(v[i].begin(), v[i].end(), a[i][j]) - v[i].begin();
v[i][idx] = a[i][j];
}
kum[i][j + 1] = max(kum[i][j], naj[i][j + 1]);
}
}
int sol = 0;
for (int i = 0; i <= n; ++i)
{
sol = max(sol, kum[0][i] + kum[1][n - i]);
}
cout << sol << endl;
for (int i = 0; i < 2; ++i)
{
v[i].clear();
}
memset(naj, 0, sizeof(naj));
memset(kum, 0, sizeof(kum));
}
return 0;
}