题目:https://www.luogu.org/problemnew/show/P2396

题意:有n个数,每次选择一个表示走$a[i]$步,每个数只能选一次。

最多有两个厄运数字,如果走到了厄运数字就不能继续走下去了。

选完所有数有多少种方案。

思路:n很小,状压。

用state表示已经选了哪几个数。如果state是厄运数字就continue

不是的话state就需要加上所有是1的,这道题卡常,所以可以用上lowbit。再开O2优化。

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<map>
 4 #include<set>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<vector>
 8 #include<cmath>
 9 #include<stack>
10 #include<queue>
11 #include<iostream>
12
13 #define inf 0x3f3f3f3f
14 #define lowbit(i) i&(-i)
15 using namespace std;
16 typedef long long LL;
17 typedef pair<int, int> pr;
18
19 int n, m;
20 const int maxn = 25;
21 const int mod = 1e9 + 7;
22 int bad[3];
23 int dp[1 << maxn], dis[1 << maxn];
24
25
26 int main()
27 {
28     scanf("%d", &n);
29     for(int i = 0; i < n; i++){
30         scanf("%d", &dis[1 << i]);
31     }
32     scanf("%d", &m);
33     for(int i = 0; i < m; i++){
34         scanf("%d", &bad[i]);
35     }
36     dp[0] = 1;
37     int mx = 1 << n;
38     for(int i = 1; i < mx; i++){
39         dis[i] = dis[i ^ lowbit(i)] + dis[lowbit(i)];
40         if(dis[i] == bad[0] || dis[i] == bad[1])continue;
41         for(int j = i, k = lowbit(j); j; j ^= k, k = lowbit(j)){
42             dp[i] += dp[i ^ k];
43             if(dp[i] >= mod)dp[i] -= mod;
44         }
45     }
46
47     printf("%d\n", dp[mx - 1]);
48     return 0;
49 }

转载于:https://www.cnblogs.com/wyboooo/p/11160126.html

洛谷P2396 yyy loves Maths VII【状压dp】相关推荐

  1. P2396 yyy loves Maths VII 状压dp 变态卡常

    很容易想到dp,但是1<<24都有1600w的复杂度,要是普通做法肯定T掉 共有maxs=(1<<n)-1种情况 首先f[ ]记录某种情况的方案数,dis[ ]记录某种情况的步 ...

  2. 洛谷——P2393 yyy loves Maths II

    P2393 yyy loves Maths II 题目背景 上次蒟蒻 redbag 可把 yyy 气坏了,yyy 说他只是小学生,蒟蒻 redbag 这次不坑他了. 题目描述 redbag 给了 yy ...

  3. [P2396] yyy loves Maths VII

    Link: P2396 传送门 Solution: 一眼能看出$O(n*2^n)$的状压$dp$ 但此题是个卡常题,$n=23/24$的时候就别想过了 这题算是提供了一种对状压$dp$的优化思路吧 原 ...

  4. [洛谷2397]yyy loves Maths VI

    题目背景 自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居然也不会,所以只好找你 题目描述 他让redbag找众数 他还特 ...

  5. 洛谷P2566 [SCOI2009]围豆豆(状压dp+计算几何)

    题面 传送门 题解 首先要解决一个问题,就是怎么判断一个点是否在多边形内部 从这个点向某一个方向做一条射线,如果这条射线和多边形的交点为奇数说明在多边形内,否则在多边形外 然而有一些特殊情况,比方说一 ...

  6. 洛谷P2397 yyy loves Maths VI (mode) 摩尔投票

    求众数的一种方法 不需要内存,排序 每次记录上次加的值以及个数,相等个数+1,不相等就-1 因为众数大于一半 最坏的情况也就是拿一个众数取走一个非众数 最后的结果肯定就是众数 //#pragma co ...

  7. 洛谷P2622 关灯问题II【状压dp+bfs】

    P2622 关灯问题II 题目描述 现有n盏灯,以及m个按钮.每个按钮可以同时控制这n盏灯--按下了第i个按钮,对于所有的灯都有一个效果.按下i按钮对于第j盏灯,是下面3中效果之一:如果a[i][j] ...

  8. 洛谷 - P2761 软件补丁问题(spfa+状压)

    题目链接:点击查看 题目大意:给出 n 个错误,再给出 m 个补丁,对于每个补丁而言,设 b1,b2,f1,f2 分别为四个集合:当且仅当 b1 所表示的错误全部存在且 b2 所表示的错误没有任何一个 ...

  9. 「洛谷P2397」 yyy loves Maths VI (mode) 解题报告

    P2397 yyy loves Maths VI (mode) 题目背景 自动上次redbag用加法好好的刁难过了yyy同学以后,yyy十分愤怒.他还击给了redbag一题,但是这题他惊讶的发现自己居 ...

最新文章

  1. SpringMVC RequestMapping注解详解
  2. linux c之assert函数使用总结
  3. spring vaadin_在Spring Boot中使用Vaadin的简介
  4. HDU2066:一个人的旅行
  5. iPhone 14 Pro渲染图曝光 网友:冲这个外观就可以买了
  6. Java多线程、主线程等待所有子线程执行完毕、共享资源
  7. Java 能抵挡住 JavaScript 的进攻吗?
  8. 耐人深思的总结,牛牛牛
  9. 毕业五年同是程序员为什么差距这么大?他年薪百万,他月薪一万
  10. python实时监控_python实时监控cpu小工具
  11. Altium designer--DB接口DB9/DB15/DB25/DB37/DB50
  12. Ceph测试工具总结
  13. 走出校门,重新起航,从纯粹到再次纯粹
  14. 对不起,不知道这些,我劝你还是别做软件测试员了!
  15. Python——单线程与多线程
  16. 乌镇互联网大会上世界大佬点赞中国创新,山寨帽子终于摘下?
  17. mapset——C++
  18. 【Android多屏适配】动态改变Listview item高度
  19. Java发送邮件时标题和发件人乱码
  20. 百度360搜索关键字

热门文章

  1. Mybatis将大于号、小于号进行转译
  2. Mysql 创建函数
  3. 毕设教学 单片机光照强度计使用
  4. 操作系统基础知识总结
  5. 晶体管为元件的计算机时代是,根据使用的元器件,将计算机的发展划分为几个时代...
  6. java string 转小写_Java String toLowerCase()(String转小写)与示例 - Break易站
  7. IOS应用程序自身的本地化
  8. atmega16单片机c语言程序设计经典实例pdf,《AVR单片机C语言程序设计实例精粹》.pdf...
  9. 网页图片画圈指摘,然后保存进数据库
  10. 自己写Linux Usb鼠标驱动程序