社区讨论

数据过水(指时间复杂度)

P4310绝世好题参与者 7已保存回复 8

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
8 条
当前快照
1 份
快照标识符
@lobzn9v4
此快照首次捕获于
2023/10/30 05:33
2 年前
此快照最后确认于
2023/11/04 10:49
2 年前
查看原帖
RT,在原来dp的基础上加个优先队列,每次优先将dp[i]的值从大往小搜,搜到了直接break
CPP
#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了。。跑的还挺快(

回复

8 条回复,欢迎继续交流。

正在加载回复...