Korney Korneevich and XOR (easy version)

这篇博客讨论了一种动态规划的方法来解决数组中找出异或和为特定值的上升子序列的问题。通过维护dp数组记录到达当前位置时,最后一位最小的异或值,最终得出满足条件的x的数量及其具体值。代码中展示了如何遍历数组并更新dp数组,以找到所有可能的异或和。
摘要由CSDN通过智能技术生成

DIV2-F1

题意:
题意说给了一个数组,你可以选出一个上升的子序列,然后这个序列的元素全部异或起来等于x,求出这样的x到底有多少个

思考:
看到数组的元素最大才500,那么全部异或起来最大也不过超过512。建立dp[i]代表,达到当前元素的时候,最后一位最小的值是多少。这种不仅能维护出是否可达,而且还能保证最优的上升序列。

代码:

int T,n,m;
int va[N];
int dp[N];

signed main()
{
	IOS;
	cin>>n;
	m = 512;
	for(int i=1;i<=n;i++) cin>>va[i];
	for(int i=1;i<=m;i++) dp[i] = inf;
	for(int i=1;i<=n;i++)
	{
		for(int j=0;j<m;j++)
		{
			if(dp[j]<va[i])
			dp[j^va[i]] = min(dp[j^va[i]],va[i]);
		}
	}
	vector<int > v;
	for(int i=0;i<m;i++)
	{
		if(dp[i]<inf)
		v.pb(i);
	}
	cout<<v.size()<<"\n";
	for(auto t:v) cout<<t<<" ";
	cout<<"\n";
	return 0;
}

总结:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值