二维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]]

 

posted @ 2024-01-21 00:10  Annaprincess  阅读(42)  评论(0)    收藏  举报