思路:
n
2
n^2
n2算法很好得出,枚举每一个i j更新k,跑一遍前缀和
思考优化,即如何快速得出k,考虑枚举每个i的母集,更新该母集所包含子集的最大值,并更新k,复杂度就是枚举子集的复杂度
3
l
o
g
(
n
)
3^{log(n)}
3log(n)
代码如下:
#include<bits/stdc++.h>
#define inf 1ll<<62
using namespace std;
int n;
int a[300010];
int max1[300010],ans[300010];
int main()
{
scanf("%d",&n);
n=1<<n;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
}
for(int i=0;i<n;i++)
{
for(int j=i;j<n;j=(j+1)|i)
{
ans[j]=max(ans[j],max1[j]+a[i]);
max1[j]=max(max1[j],a[i]);
}
}
for(int i=1;i<n;i++)
{
ans[i]=max(ans[i],ans[i-1]);
printf("%d\n",ans[i]);
}
}