二维dp--选数异或
题目:

查看代码
#include <iostream>
using namespace std;
int a[100006];
int dp[100006][64];//到第i个数为止异或和
int main()
{
int n,x;
cin>>n>>x;
for(int i=1;i<=n;i++)cin>>a[i];
dp[0][0]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<64;j++){
dp[i][j]=(dp[i-1][j]+dp[i-1][j^a[i]])%998244353;
}
}
cout<<dp[n][x];
// 请在此输入您的代码
return 0;
}
------------
方法:
利用动态规划:
2维dp
dp的流程:
(1)第一步:初始化
利用一个动态规划数组dp[i][j]表示到第i个数异或和为j
(2)第二步:dp转化方程
dp[i][j]可以由两部分而来
- 第一部分 不包括第i个元素
dp[i-1][j]
- 第二部分 包括第i个元素
dp[i-1][j^a[i]]

浙公网安备 33010602011771号