题目:• 初始长度2^n的01序列列,要从^&|中选择n个运算符。• 序列长度:(2^n)->(2^(n-1))-> … ->16->8->4->2->1。• 问有多少个可能,使得运算后剩下的一个字符为1。
思路:
比赛时为啥不好好看看想想这个题呢,只想那个构造去了,,真的是垃圾
#include <bits/stdc++.h>
using namespace std;
int n;
int a[20][1<<20],dp[20][1<<20];
int dfs(int n)
{
if(n==0)
return a[n][0]==1;
int tmp=0;
if(n<=4)
{
for(int i=0;i<(1<<n);i++)
if(a[n][i])
tmp|=(1<<i);
if(dp[n][tmp]!=-1)
return dp[n][tmp];
}
int ans=0;
for(int i=0;i<(1<<(n-1));i++)
a[n-1][i]=a[n][i*2]|a[n][i*2+1];
ans+=dfs(n-1);
for(int i=0;i<(1<<(n-1));i++)
a[n-1][i]=a[n][i*2]^a[n][i*2+1];
ans+=dfs(n-1);
for(int i=0;i<(1<<(n-1));i++)
a[n-1][i]=a[n][i*2]&a[n][i*2+1];
ans+=dfs(n-1);
if(n<=4)
dp[n][tmp]=ans;
return ans;
}
int main()
{
scanf("%d",&n);
for(int i=0;i<(1<<n);i++)
scanf("%1d",&a[n][i]);
memset(dp,-1,sizeof dp);
printf("%d\n",dfs(n));
return 0;
}

本文探讨了一道算法题目,该题目要求从初始长度为2^n的01序列出发,通过选择n个运算符(包括按位与、按位或、按位异或),计算所有可能组合下最终得到1的情况总数。文章提供了一个递归深度优先搜索的解决方案,并使用了动态规划进行优化。
1154

被折叠的 条评论
为什么被折叠?



