社区讨论
数据过水(指时间复杂度)
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;
}
可以看到这种算法是很容易被卡的,最坏情况下比原先的dp 还要慢,但是却A了。。跑的还挺快(
回复
共 8 条回复,欢迎继续交流。
正在加载回复...