题目链接:https://codeforces.com/contest/1208/problem/F
神奇的SOSdp?感觉就是数位dp啊
https://codeforces.com/blog/entry/45223
hint:这个题要把dp的顺序反一下
代码:
#include<bits/stdc++.h>
#define xx first
#define yy second
#define mp make_pair
#define pb push_back
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int MAXN=1e6+5;
int dp[(1<<21)+1][22],a[MAXN];
void dfs(int num,int k)
{
if(k>20) return ;
if(dp[num][k]>1) return ;
dp[num][k]++;
dfs(num,k+1);
if((num>>k)&1)
dfs(num^(1<<k),k);
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
int ans=0;
for(int i=n;i>=1;i--)
{
int res=0;
int t=0;
for(int j=20;j>=0;j--)
{
if((a[i]>>j)&1) res|=1<<j;
else if(dp[t|(1<<j)][20]>1)
res|=1<<j,t|=1<<j;
}
dfs(a[i],0);
if(i<=n-2)
ans=max(ans,res);
}
printf("%d\n",ans);
return 0;
}