Luogu P4892 GodFly的寻宝之旅【状压dp】By cellur925
又是一道状压+计数类好题hh(真香)。数据范围非常友好,告诉我们\(n<=18\),非常符合状压的性质。
其实感觉和\(Hamilton\)路径那题还是有些相似的,我们可以类似地设计出状态:\(f[i][j][w]\)表示当前状态为\(i\),现在位于\(j\)点,体力耗费为\(w\)(\(w\)只有两种可能)的方案数。
我们考虑转移的时候向之后的状态转移,设\(i\)为当前的状态,\(j\)为上一个最后落在的位置,\(k\)是这一次最后落在的位置。因为有滑稽态&&奇偶态两种,所以有两种转移。因为边数在\(1e5\)的范围内,所以肯定是个稠密图,有很多很多重边,又因为本题数据范围很小,不妨直接用邻接矩阵存下两点间有多少重边。转移的时候就可以直接从上一方案乘上重边数转移过来。又注意到题中的\(sum()\)其实是可以预处理出来的,所以我们就先搞出来降低复杂度。
最后我们得到了转移方程:
(f[i|(1<<(k-1))][k][(0+k*st[i])%2]+=1ll*f[i][j][0]*cnt[k][j])%=moder;
(f[i|(1<<(k-1))][k][(1+k*st[i])%2]+=1ll*f[i][j][1]*cnt[k][j])%=moder;
\(Code\)
#include<cstdio>
#include<algorithm>
#define maxn 300000
using namespace std;
typedef long long ll;
const ll moder=19260817;
int n,m,opt,fake;
ll ans,st[maxn],f[maxn][20][3];
int cnt[30][30];
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x=0,y=0;
scanf("%d%d",&x,&y);
cnt[x][y]++,cnt[y][x]++;
}
scanf("%d",&opt);
fake=(1<<n)-1;
for(int i=0;i<=fake;i++)
for(int j=0;j<n;j++)
if(i&(1<<j)) st[i]+=j+1;
f[1][1][0]=1;
for(int i=0;i<=fake;i++)
for(int j=1;j<=n;j++)
{//枚举上一个位置
if(!(i&(1<<(j-1)))) continue;
for(int k=1;k<=n;k++)
{//枚举当前落到的位置
if(i&(1<<(k-1))) continue;
(f[i|(1<<(k-1))][k][(0+k*st[i])%2]+=1ll*f[i][j][0]*cnt[k][j])%=moder;
(f[i|(1<<(k-1))][k][(1+k*st[i])%2]+=1ll*f[i][j][1]*cnt[k][j])%=moder;
}
}
for(int i=0;i<=fake;i++)
(ans+=f[i][n][opt])%=moder;
printf("%lld\n",ans);
return 0;
}
另外注意审题:题面中的价值的描述十分清楚,路径集合\(A\)是加入\(m\)前的。所以在转移和赋初值的时候要明确这一点。我才不会告诉你开始的时候没注意这一点
Luogu P4892 GodFly的寻宝之旅【状压dp】By cellur925的更多相关文章
- [LuoguP4892]GodFly的寻宝之旅 状压DP
链接 基础状压DP,预处理出sum,按照题意模拟即可 复杂度 \(O(n^22^n)\) #include<bits/stdc++.h> #define REP(i,a,b) for(in ...
- Luogu 2157 [SDOI2009]学校食堂 - 状压dp
Solution 比较好想的dp, 但是坑不少QAQ, 调半天 由于容忍度 $b_i$<= 7, 所以可以考虑将第$i$个人接下来的$b_i$ 个人作为一个维度记录状态. 于是我们定义数组$f[ ...
- 洛谷 P3112 后卫马克 —— 状压DP
题目:https://www.luogu.org/problemnew/show/P3112 状压DP...转移不错. 代码如下: #include<iostream> #include& ...
- 洛谷 3112 [USACO14DEC]后卫马克Guard Mark——状压dp
题目:https://www.luogu.org/problemnew/show/P3112 状压dp.发现只需要记录当前状态的牛中剩余承重最小的值. #include<iostream> ...
- BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)
题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4042 (Luogu) https://www.luogu.org/prob ...
- [Luogu P3959] 宝藏 (状压DP+枚举子集)
题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...
- [Luogu P2831] 愤怒的小鸟 (状压DP)
题面: 传送门:https://www.luogu.org/problemnew/show/P2831 Solution 首先,我们可以先康一康题目的数据范围:n<=18,应该是状压或者是搜索. ...
- [Luogu P2051] [AHOI2009]中国象棋 (状压DP->网格DP)
题面 传送门:https://www.luogu.org/problemnew/show/P2051 Solution 看到这题,我们不妨先看一下数据范围 30pt:n,m<=6 显然搜索,直接 ...
- 【Luogu】P1896互不侵犯King(状压DP)
题目链接 真是可恶,被数据范围坑了一把.想要一遍AC的希望破灭了…… 以后大家在做状压DP的时候一定要开long long…… 设f[i][j][k]表示考虑前i行,总共放了j个King,第i行状态为 ...
随机推荐
- java socket相关的timeout
1 java socket的两个timeout 一个是connect timeout,即建立连接的timeout,另外一个是so timeout,是读取数据的timeout.这两个timeout都是因 ...
- aop学习总结三----aop的相关概念
aop学习总结三----aop的相关概念 public Object invoke(Object proxy, Method method, Object[] args) throws Throwab ...
- 2 Maven使用入门
一.编写pom.xml文件 Maven项目的核心是pom.xml.POM(Project Object Model,项目对象模型)定义了项目的基本信息,用于描述项目如何构建,声明项目依赖等等. ...
- [HTML & CSS] HTML和CSS基础知识
最近将博客简单地修饰了下,需要用到HTML和CSS代码,花了一天时间学习了一下这两方面的知识.虽然内容很简单,但是足够用来修改自己的博客了. 1. HTML 1.1. HTML介绍 HTML与CSS的 ...
- UVA10870 Recurrences —— 矩阵快速幂
题目链接:https://vjudge.net/problem/UVA-10870 题意: 典型的矩阵快速幂的运用.比一般的斐波那契数推导式多了几项而已. 代码如下: #include <bit ...
- CSU1808 地铁 —— dijkstra变形
题目链接:http://acm.csu.edu.cn/csuoj/problemset/problem?pid=1808 题解:由于中转线路需要花费一定的时间,所以一般的以顶点为研究对象的dijkst ...
- pypi指定下载源
pip install -i http://pypi.douban.com/simple/ scipy==0.19.0
- 【C/C++】获取当前系统时间
#include<iostream> #include<Ctime> using namespace std; int main() { time_t t; time(& ...
- C++中对类的提前引用声明注意事项
//或许,友元是VC++6.0心里永远的痛,对于这个BUG我一直很介意.//注:这个程序在VC++6.0里是行不通的,在VS2008里是可以的.#include <iostream> #i ...
- Opencv— — image offset
// define head function #ifndef PS_ALGORITHM_H_INCLUDED #define PS_ALGORITHM_H_INCLUDED #include < ...