题解:P12236 [蓝桥杯 2023 国 Java A] 连续数组
Solution
这道题目有点难看出该如何设计状态。但是我们注意到题目中所说的
但这个方程并不是随便乱用的,还得符合题目要求。还得判断
至于初始化,当然是以每个数字开头的情况赋值为
将以不同数字结尾的每种情况统计起来即可。
AC code
#include <bits/stdc++.h>
using namespace std;
#define int long long
int n,a[16],dp[1<<16][16];
int num(int x){//这个num是用于计算一个数字在二进制下有多少个 1
int res=0;
while(x){
x-=x&(-x);
res++;
}
return res;
}
signed main(){
cin>>n;
for(int i = 1;i<n;i++) cin>>a[i];
for(int i = 0;i<n;i++) dp[1<<i][i]=1;
for(int i = 1;i<1<<n;i++){
for(int j = 0;j<n;j++){
if(i&(1<<j)==0) continue;
for(int k = 0;k<n;k++){
if(j==k||i&(1<<k)==0) continue;
if(a[num(i)-1]==0&&j==k+1) continue;
if(a[num(i)-1]&&j!=k+1) continue;
dp[i][j]+=dp[i^(1<<j)][k];
}
}
}
int ans=0;
for(int i = 0;i<n;i++) ans+=dp[(1<<n)-1][i];
cout<<ans;
return 0;
}