对 sosdp 的一些理解
sosdp 可以做的题目:对子集/超集的 dp,这里对子集相关的部分做一下分析
参考资料
设 表示从低到高考虑到 的第 位(从 0 开始算),而且这 位都是 的子集并且第 位及以上都和 完全相同时的和
那么只需要对 的第 位进行分析来转移
- 该位为 0,那么显然这一位只能取 0,也就是说
- 该位为 1,那么这一位可以取 0/1 ,
代码如:
for(int mask = 0; mask < (1<<N); ++mask){
dp[mask][-1] = A[mask];
for(int i = 0;i < N; ++i){
if(mask & (1<<i))
dp[mask][i] = dp[mask][i-1] + dp[mask^(1<<i)][i-1];
else
dp[mask][i] = dp[mask][i-1];
}
F[mask] = dp[mask][N-1];
}
滚存一下就得到了常见的写法:
for(int i = 0; i<(1<<N); ++i)
F[i] = A[i];
for(int i = 0;i < N; ++i) for(int mask = 0; mask < (1<<N); ++mask){
if(mask & (1<<i))
F[mask] += F[mask^(1<<i)];
}
时间复杂度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 记一次.NET内存居高不下排查解决与启示