Spoj CODERE3任务

时间:2018-02-21 20:01:35

标签: c++ algorithm dynamic-programming

我一直在尝试在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;
}

0 个答案:

没有答案