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)dp 还要慢,但是却A了。。跑的还挺快(