ZOJ 3644 Kitty's Game dfs,记忆化搜索,map映射 难度:2
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的更多相关文章
- 不要62 hdu 2089 dfs记忆化搜索
题目:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题意: 给你两个数作为一个闭区间的端点,求出该区间中不包含数字4和62的数的个数 思路: 数位dp中 ...
- dfs+记忆化搜索,求任意两点之间的最长路径
C.Coolest Ski Route 题意:n个点,m条边组成的有向图,求任意两点之间的最长路径 dfs记忆化搜索 #include<iostream> #include<stri ...
- hdu 1078 FatMouse and Cheese (dfs+记忆化搜索)
pid=1078">FatMouse and Cheese Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/ ...
- hdu 1078(dfs记忆化搜索)
题意:容易理解... 思路:我开始是用dfs剪枝做的,968ms险过的,后来在网上学习了记忆化搜索=深搜形式+dp思想,时间复杂度大大降低,我个人理解,就是从某一个点出发,前面的点是由后面的点求出的, ...
- UVA 10400 Game Show Math (dfs + 记忆化搜索)
Problem H Game Show Math Input: standard input Output: standard output Time Limit: 15 seconds A game ...
- 8636 跳格子(dfs+记忆化搜索)
8636 跳格子 该题有题解 时间限制:2457MS 内存限制:1000K提交次数:139 通过次数:46 题型: 编程题 语言: G++;GCC Description 地上有一个n*m 的数 ...
- poj1088-滑雪 【dfs 记忆化搜索】
http://poj.org/problem?id=1088 滑雪 Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 79806 ...
- DFS——>记忆化搜索——>动态规划
以洛谷P1802 5倍经验日 为例 https://www.luogu.org/problem/show?pid=1802 题目背景 现在乐斗有活动了!每打一个人可以获得5倍经验!absi2011却 ...
- POJ 1191 棋盘分割 【DFS记忆化搜索经典】
题目传送门:http://poj.org/problem?id=1191 棋盘分割 Time Limit: 1000MS Memory Limit: 10000K Total Submission ...
随机推荐
- Python变量类型
Python变量类型 变量是存储在内存中的值,因此在创建变量时会在内存中开辟一个空间. 基于变量的数据类型,解释器会分配指定的内存,并决定什么数据可以被存储在内存中. 因此变量可以指定不同的数据类型, ...
- sql语句语法大全
一.基础 1.说明:创建数据库 CREATE DATABASE database-name 2.说明:删除数据库 drop database dbname 3.说明:备份sql server --- ...
- Maven最佳实践:划分模块
http://juvenshun.iteye.com/blog/305865 ************************************* "分天下为三十六郡,郡置守,尉,监& ...
- dbca建库时找不到ASM磁盘
现象 dbca创建数据库时,找不到ASM磁盘组:而grid用户使用asmca却又能看到ASM磁盘组. 解决方法 1. 检查设备的权限,正确的权限为grid:asmadmin 2. 检查GRID_HOM ...
- Spring MVC 之类型转换(五)
虽然SpringMVC可以自动绑定多种数据类型,但是有时候有些特殊的数据类型还是会在绑定时发生错误,需要我们自己书写类型转换完成绑定. SpringMVC中提供两种绑定方式:以时间转换为例. 1.属性 ...
- Windows不重启就使环境变量修改生效
以修改环境变量“PATH”为例,修改完成后,进入DOS命令提示符,输入:set PATH=C: ,关闭DOS窗口.再次打开DOS窗口,输入:echo %PATH% ,可以发现“我的电脑”->“属 ...
- bottomNavigationBar 底部导航tab MD
1.先上图: 此底部Tab完全可以满足日常的开发 2.使用: 很简单,使用Gradle构建:compile ‘com.ashokvarma.android:bottom-navigation-bar: ...
- 移动端的touch事件处理
简要的探讨一下移动端 touch 事件处理几个坑,以及相应的简单处理方法. click 穿透 假设有个弹出层,上面有个关闭的按钮支持 touchend 触发后关闭,若正好下方有个元素支持 click ...
- 1.1 ASP.NET MVC简介
1.什么是ASP.NET MVC? (1)它是个怎么样的产品? ASP.NET MVC是微软公司.NET平台上的一个Web开发框架,它为开发者提供了一种构建结构良好的Web应用程序的方式.自2007年 ...
- 30-Razor语法基础
以往开发ASP.NET Web Form时,在ASPX页面上都会出现许多夹杂C#/VB.NET与HTML的情况,而先前使用<%...%>这种传统圆角括号的表示法会让HTML标签与ASP.N ...