数据过水(指时间复杂度)
查看原帖
数据过水(指时间复杂度)
125429
SfumatoCannon_楼主2021/8/13 10:49

RT,在原来dp的基础上加个优先队列,每次优先将dp[i]的值从大往小搜,搜到了直接break

#include <cstdio>
#include <queue>
using namespace std;
#define MAXN 100001
int n;
int a[MAXN];
int dp[MAXN];
struct node
{
    int value;
    int id;
    node(int a = 0, int b = 0)
    {
        value = a;
        id = b;
    }
    bool operator<(const node &x) const
    {
        return value < x.value;
    }
};
priority_queue<node> Q;
queue<node> P;
int main()
{
    scanf("%d", &n);
    int i, j;
    node x;
    for (i = 1; i <= n; i++)
        scanf("%d", &a[i]);
    dp[1] = 1;
    Q.push(node(1, 1));
    for (i = 2; i <= n; i++) //now
    {
        while (!Q.empty())
        {
            x = Q.top();
            P.push(x);
            Q.pop();
            if (a[i] & a[x.id])
            {
                dp[i] = x.value + 1;
                Q.push(node(dp[i], i));
                break;
            }
        }
        while (!P.empty())
        {
            Q.push(P.front());
            P.pop();
        }
    }
    int maxx = -1;
    for (i = 1; i <= n; i++)
        maxx = max(maxx, dp[i]);
    printf("%d", maxx);
    return 0;
}

可以看到这种算法是很容易被卡的,最坏情况下比原先的O(n2)O(n^2)dp 还要慢,但是却A了。。跑的还挺快(

2021/8/13 10:49
加载中...