社区讨论

关于sosdp维护超集的疑问

学术版参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mid2ksdh
此快照首次捕获于
2025/11/24 19:34
3 个月前
此快照最后确认于
2025/11/24 20:04
3 个月前
查看原帖
CF1870E Bits And Pieces
第一篇题解dp的写法。
这是从小到大转移
CPP
void sos(int len){
	for(int i=0;i<21;i++)
		for(int j=0;j<len;j++)
			if(!(j&(1<<i))){
				update(j,mx[j^(1<<i)]);
				update(j,cx[j^(1<<i)]);
			}
	return ;
}
我的写法(从大到小)(通过了题目):
CPP
void sos(int len){
	for(int i=0;i<21;i++)
		for(int j=len-1;j>=0;j--)
			if(!(j&(1<<i))){
				update(j,mx[j^(1<<i)]);
				update(j,cx[j^(1<<i)]);
			}
	return ;
}
疑问1:为什么从小到大是对的?用 dp[j xor (1<<i])dp[j \text{ xor }(1<<i]) 来更新 dp[j]dp[j],此时 dp[j xor (1<<i)]dp[j \text{ xor }(1<<i)] 不一定是最优解吧。因为 dp[j xor (1<<i)]dp[j \text{ xor }(1<<i)] 此时没有被更新过一次,只有初始时赋的值。
疑问2:我的从大到小的写法正确吗?因为没看到有题解这样写。

回复

3 条回复,欢迎继续交流。

正在加载回复...