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 ...
随机推荐
- css3动画导航实现
代码 <!DOCTYPE html> <!-- saved from url=(0223)file:///C:/Users/user/AppData/Local/Temp/HZ$D. ...
- Java中List、Collections实现梭哈游戏
package ch8; import java.util.*; /** * Created by Jiqing on 2016/11/27. */ public class ShowHand { / ...
- Java编程思想学习笔记_6(并发)
一.从任务中产生返回值,Callable接口的使用 Callable是一种具有泛型类型参数的泛型,它的类型参数表示的是从方法call返回的值,而且必须使Executor.submit来去调用它.sub ...
- C++模板(基础)
本文转至:http://www.cnblogs.com/gw811/archive/2012/10/25/2738929.html C++模板 模板是C++支持参数化多态的工具,使用模板可以使用户为类 ...
- LINUX多线程(一)(创建和退出)
1. Linux多线程概述 1.1. 概述 进程是系统中程序执行和资源分配的基本单位.每个进程有自己的数据段.代码段和堆栈段.这就造成进程在进行切换等操作时都需要有比较负责的上下文切换等动作.为了进一 ...
- 使用JSPatch平台热修复iosApp
IOS产品开发中常常会遇到这种情况,线上发现一个严重bug,可能是一个crash,可能是一个功能无法使用,这时能做的只是赶紧修复Bug然后提交等待漫长的审核,即使申请加急也不会快到那里去,即使审核完了 ...
- TCP拥塞控制
TCP必须使用端到端拥塞控制而不是使网络辅助的拥塞控制,因为IP层不向端系统提供显式的网络拥塞反馈.TCP采用的方法是让每一个发送方根据所感知到的网络拥塞程度来限制其能向连接发送流量的速率. 几个相关 ...
- LWIP协议中tcp_seg结构相关指针的个人理解
我曾经写在新浪博客上面,后来复制到这,图片就不行了. 原文地址转载 LWIP协议中tcp_seg结构相关指针的个人理解(http://blog.sina.com.cn/s/blog_7e586985 ...
- reveal 1.6.3 本机破解及使用
reveal 强大的iOS UI调试工具 1: 去官网下载最新版本:1.6.3 http://revealapp.com/download/ 2: 安装到mac上,即,解压下载的包,把app拖到mac ...
- centos7 修改selinux 开机导致 faild to load SELinux policy freezing 错误
centos7 修改selinux 开机导致 faild to load SELinux policy freezing 错误 之前把selinux关闭了,这次想打开selinux,于是修改了 /e ...