ZOJ 3644 Kitty's Game dfs,记忆化搜索,map映射 难度:2

时间:2022-04-20 02:53:37

http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834

从点1出发,假设现在在i,点数为sta,则下一步的点数必然不能是sta的因数,所以不会形成环,只需从1直接走,走到n即可.

但是如果这样的话时空复杂度就都是nk,明显不满足题意,而这个时候我们可以想到,每个状态都必然是k的约数,(点数不是k的约数的节点不在路上,可以无视),而约数的个数也就k^0.5个,可以直接用map映射,这样时空复杂度都是n*k^0.5,可以解出答案.

一开始直接用dfs,结果TLE了.

#include <cstdio>
#include <cstring>
#include <map>
using namespace std;
const int maxn = 2001;
const int maxm = 2e4+4;
const int mod = 1000000007;
const int maxk = 1e6+6;
int n,m,k;
int p[maxn];
typedef long long ll;
map<int ,int >id;
ll dp[maxn][maxn];
int first[maxn];
struct edge{
int nxt,t;
}e[maxm];
void addedge(int f,int t,int ind){
e[ind].nxt = first[f];
e[ind].t = t;
first[f] = ind;
}
int bit[30],num;
void apart(int k){
for(int i=2;i*i<=k;i++){
while(k%i==0){
bit[num++]=i;
k/=i;
}
}
if(k>1)bit[num++]=k;
}
ll gcd(ll a,ll b){
if(b==0)return a;
return gcd(b,a%b);
}
ll lcm(ll a,ll b){
return a*b/gcd(a,b);
}
bool vis[maxn];
int cnt;
ll dfs(int s,int sav){
if(id[sav]!=0&&dp[s][id[sav]]!=0)return dp[s][id[sav]];
if(s==n)return sav==k?1:0;
vis[s]=true;
if(id[sav]==0)id[sav]=++cnt;
for(int pe=first[s];pe!=-1;pe=e[pe].nxt){
int t=e[pe].t;
ll lcmnum=lcm(p[t],sav);
if(vis[t]||lcmnum==sav||lcmnum>k)continue;
dp[s][id[sav]]+=dfs(t,lcmnum);
dp[s][id[sav]]%=mod;
}
vis[s]=false;
return dp[s][id[sav]];
}
int solve(){
num=0;
apart(k);
if(lcm(p[1],k)!=k||lcm(p[n],k)!=k)return 0;
for(int i=2;i<n;i++){
if(lcm(p[i],k)!=k){
vis[i]=true;
}
}
return dfs(1,p[1]);
} void init(){
memset(first,-1,sizeof first);
memset(dp,0,sizeof dp);
memset(vis,0,sizeof vis);
cnt=0;
id.clear();
}
int main(){
while(scanf("%d%d%d",&n,&m,&k)==3){
init();
for(int i = 0;i < m;i++){
int f,t;
scanf("%d%d",&f,&t);
addedge(f,t,i);
}
for(int i = 1;i <= n;i++){
scanf("%d",p+i);
}
int ans=solve();
printf("%d\n",ans);
}
return 0;
}

ZOJ 3644 Kitty's Game dfs,记忆化搜索,map映射 难度:2的更多相关文章

  1. 不要62 hdu 2089 dfs记忆化搜索

    题目:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意: 给你两个数作为一个闭区间的端点,求出该区间中不包含数字4和62的数的个数 思路: 数位dp中 ...

  2. dfs&plus;记忆化搜索,求任意两点之间的最长路径

    C.Coolest Ski Route 题意:n个点,m条边组成的有向图,求任意两点之间的最长路径 dfs记忆化搜索 #include<iostream> #include<stri ...

  3. hdu 1078 FatMouse and Cheese (dfs&plus;记忆化搜索)

    pid=1078">FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/ ...

  4. hdu 1078&lpar;dfs记忆化搜索&rpar;

    题意:容易理解... 思路:我开始是用dfs剪枝做的,968ms险过的,后来在网上学习了记忆化搜索=深搜形式+dp思想,时间复杂度大大降低,我个人理解,就是从某一个点出发,前面的点是由后面的点求出的, ...

  5. UVA 10400 Game Show Math &lpar;dfs &plus; 记忆化搜索&rpar;

    Problem H Game Show Math Input: standard input Output: standard output Time Limit: 15 seconds A game ...

  6. 8636 跳格子(dfs&plus;记忆化搜索)

    8636 跳格子 该题有题解 时间限制:2457MS  内存限制:1000K提交次数:139 通过次数:46 题型: 编程题   语言: G++;GCC Description 地上有一个n*m 的数 ...

  7. poj1088-滑雪 【dfs 记忆化搜索】

    http://poj.org/problem?id=1088 滑雪 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 79806 ...

  8. DFS——&gt&semi;记忆化搜索——&gt&semi;动态规划

    以洛谷P1802  5倍经验日 为例 https://www.luogu.org/problem/show?pid=1802 题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却 ...

  9. POJ 1191 棋盘分割 【DFS记忆化搜索经典】

    题目传送门:http://poj.org/problem?id=1191 棋盘分割 Time Limit: 1000MS   Memory Limit: 10000K Total Submission ...

随机推荐

  1. 2013-09-22 &lbrack;随笔&rsqb;-Roy

    不能因为一些小事情而一直影响自己的心情. 每天过得都应该有重点,无论是家庭还是工作还是其他. 要多花时间去吸取些新东西,看书,丰富自己的想法. 不能让日常的乱七八糟影响心情. bingo!

  2. java之RTTI和反射的理解

    最近在读 Thinking in Java 这本书.读到类型信息这一张时,刚开始对书中所说的RTTI和反射彻底混了,不知道有什么联系,有哪些相同点和区别.于是在网上又找了些内容辅助理解,这一章又重新读 ...

  3. Grunt插件之LiveReload 实现页面自动刷新,所见即所得编辑

    苦B的前端每次在制作和修改页面时,都有一个特定的三部曲:coding-save-F5.很多时候都希望自己一改东西,页面就能立刻显示,而现在LiveReload就能做到这点. LiveReload会监控 ...

  4. 简单Spring&plus;Struts2&plus;Hibernate框架搭建

    使用Maven+Spring+Struts2+Hibernate整合 pom文件 <project xmlns="http://maven.apache.org/POM/4.0.0&q ...

  5. ubuntu网桥设置

    什么是桥接? 桥接(Bridging),是指依据OSI网络模型的链路层的地址,对网络数据包进行转发的过程,工作在OSI的第二层.一般的交换机,网桥就有桥接作用. 一般的交换机,网桥就有桥接作用.就交换 ...

  6. 接口自动化:HttpClient &plus; TestNG &plus; Java&lpar;五&rpar; - 接口测试数据驱动

    在上一篇中,我们实现了post方法请求的封装和测试,这一篇我们做测试数据的分离. 5.1 测试数据处理思路 5.1.1 测试数据分离 这里我想到,我们之前的测试demo里,全都是在testNG类里去写 ...

  7. MySQL 5&period;7 忘记密码

    MySQL 5.7 忘记Root密码 用管理员身份运行cmd.然后使用命令进行: 1.打开MySQL>bin文件夹 >cd C:\mysql\mysql5.7.14\bin 2.停止mys ...

  8. 6&period;01-re-split&lowbar;chinese

    import re # 1.拆分字符串 one = 'asdsfsgsh' # 标准 是 s 为拆分 pattern = re.compile('s') result = pattern.split( ...

  9. 浅谈JavaScript对象数组根据某属性sort升降序排序

    1.自定义一个比较器,其参数为待排序的属性. 2.将带参数的比较器传入sort(). var data = [ {name: "Bruce", age: 23, id: 16, s ...

  10. Navicat Premium 12&period;0&period;18 &sol; 12&period;0&period;24安装与激活

    若使用Navicat Premium 12.1.8.0请转至Navicat Premium 12.1.8.0安装与激活,其实每个小版本更迭变化不大.另外最重要的是,请仔细阅读本文激活部分,总有一些人遇 ...