abc288g

通过这道题复习一下sosdp。
sosdp用于求解子集和。
我们设f[i][s]表示后i位是s的子集,前ni位等于sa中的数的和
在从f[i][s]转移到f[i+1]时,需要分2种情况讨论。
1.当s的第i+1位是1f[i+1][s]=f[i][s]+f[i][sxor2i]
2.当s的第i+1位是1f[i+1][s]=f[i][s]

这道题事实上可以类似sosdp,然后把这个过程反着做。

#include<bits/stdc++.h>
using namespace std;
int n,a[1000000],pw[1000],f[1000000][15];
int main(){
	pw[0]=1;
	for(int i=1;i<14;i++)
		pw[i]=pw[i-1]*3;
	scanf("%d",&n);
	for(int i=0;i<pw[n];i++)
		scanf("%d",&a[i]);
	for(int i=0;i<pw[n];i++)
		f[i][0]=a[i];
	for(int i=0;i<n;i++)
		for(int j=0;j<pw[n];j++){
			int wz=(j/pw[i])%3;
			int pz=wz*pw[i];
			int p1=f[j-pz][i],p2=f[j-pz+pw[i]][i],p3=f[j-pz+pw[i]*2][i];
			if(wz==0)
				f[j][i+1]=p2-p3;
			else if(wz==1)
				f[j][i+1]=p3+p1-p2;
			else
				f[j][i+1]=p2-p1;
		}
	for(int i=0;i<pw[n];i++)
		printf("%d ",f[i][n]);
}
posted @   celerity1  阅读(23)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下
点击右上角即可分享
微信分享提示