【每日一题】2019 ICPC Malaysia National F 状压dp

一道有趣的编程竞赛题目,涉及动态规划和状态压缩技术。题目要求两行正整数按照1到n顺序匹配,匹配条件包括数值不超过e且避开k组特定数对。通过状压dp转移状态,考虑是否在有效范围内、能否放置以及位置使用情况。解题关键在于理解状压选择的原因和与、或运算在状态表示中的作用,以及为何需要遍历所有可能状态来求解最终答案。
摘要由CSDN通过智能技术生成

这题有点意思,卡了不少时间

 题目大意就是有两行正整数按照从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;
			}
		}
	}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值