这题有点意思,卡了不少时间
题目大意就是有两行正整数按照从1到n的顺序排列,两行数之间两两匹配,有两个条件要满足,1是两数之间不能超过e,2是有k组数不能匹配。
看到e的取值不大我们直接选择状压
dp[当前位置][当前状态]+=dp[上个位置][上个状态]
for(int i=1;i<=n;i++){//选一个人
for(int p=0;p<(1<<(2*e+1));p++){//上一个人的所有状态
for(int j=-e;j<=e;j++){//左右匹配
int kk=i+j;//匹配的位置
if(kk<1||kk>n||mp[i][kk]==1)continue;//不符合条件2
if((p>>1)&(1<<(j+e)))continue;//对面有人匹配了
kk=((p>>1)|(1<<(j+e)));//或运算
dp[i][kk]+=dp[i-1][p];
dp[i][kk]=dp[i][kk]%md;
}
}
}