转移的时候一定要想清楚了转移的本质是什么…

懵逼的 题目

扯淡的 题解

f[i][j]是前i个数中, 末尾数的第j位是1时最大的答案

转移的时候别忘了要枚举当前数的所有位, 把能转移的取一个$\max$, 以及别忘了不能转移的赋成f[i - 1][j]即可

沙茶的 代码

/**************************************************************
    Problem: 4300
    User: Cansult
    Language: C++
    Result: Accepted
    Time:216 ms
    Memory:15740 kb
****************************************************************/

#include <iostream>
#include <cstdio>
#include <cstring>
#define MAXN (100000 + 5)
#define MAXL (31 + 5)
using namespace std;
int f[MAXN][MAXL], n, a[MAXN];
int main()
{
    scanf("%d", &n);
    for (int i = 1; i <= n; i++)
    {
        scanf("%d", &a[i]);
        int dqmax = 0;
        for (int j = 0; j <= 32; j++)
            if (a[i] & (1ll << j))
                dqmax = max(dqmax, f[i - 1][j]);
        for (int j = 0; j <= 32; j++)
            if (a[i] & (1ll << j))
                f[i][j] = dqmax + 1;
            else
                f[i][j] = f[i - 1][j];
    }
    int ans = 0;
    for (int i = 0; i <= 32; i++)
        ans = max(ans, f[n][i]);
    if (!ans)
        puts("0");
    else
        printf("%d", ans);
    return 0;
}


By 联赛钦定爆零的 Cansult