Lightoj1018 【状压DP】

题意:

给你一个坐标系,坐标系上有N个点,然后让你用最少的线,把这些点全部连起来;


思路:

(1+15)*15/2=90条线;
然后线上有哪些点就可以知道;
然后按照线上点的个数排序,然后删掉这个线,看一下是否满足;
但是这种想法不就是每次拿点最多的线,然后判断是否满足,这样的话很明显就不行= =
所以DP。

N<=15很明显可以状压,所以想到状压DP。
每个状态表示有几个点还没有选,然后如果点数<=2,那么答案  dp[now_status]=dp[pre_status]+1;
点用二进制数表示状态,那么我们用线存的也是一个值,表示该线上有多少个点就好了(这个才是状压DP的精髓吧,一旦结果是状压,那么条件也是状压)

用line[i][j] 表示i , j上有多少个点,line[i][j] | = (1<<id);

每次状态dp[now_status]=dp[now_status&(~line[i][j])](意思就是在之前那个没有把这条线加了的点的情况转移过来)+1(加这条线以后,线多一条);

感觉也是记忆化搜索写的方便;


转载于:https://www.cnblogs.com/keyboarder-zsq/p/6216750.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值