lightoj 1018 - Brush (IV)

题目要求在平面上通过最少的直线清除N个点,利用二进制表示点的状态并采用动态规划方法进行解决。关键在于找到两点间线段覆盖的状态转移,通过line数组优化状态转移,避免了枚举三点一线导致的超时问题。本地测试时未优化的算法在小规模数据上已耗时过长,优化后的解决方案对于大规模数据(如3000)至关重要。
摘要由CSDN通过智能技术生成

题目链接:http://lightoj.com/volume_showproblem.php?problem=1018

题意分析:二分平面上有N个点,现在有一把可沿着任何方向走的刷子可以刷去这些点,问最少需要刷出多少条直线可以把点刷完?

解题思路:这个是个比较典型的状压dp问题,首先N不大,可以用二进制表示每个点的状态,1表示还没有被刷掉,0表示被刷掉了。

那么状态from中有num个1,如果num<=2显然是为1的,0的话就是0。那么我们想法刷掉from中的点,这样就可以得到状态to,比如我们刷掉的是i,j两个点,显然,这两个点中间的点也会被刷掉,用line[i][j]表示这两点之间点的状态,然后对应着把from中对应line[i][j]的点变成0,这样就得到状态to了,dp[from]=min(dp[from],dp[from|line[i][j]]+1)。

当然也可以写成记忆画搜索的。。。

感悟

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值