zoj 3644(dp + 记忆化搜索)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834
思路:dp[i][j]表示当前节点在i,分数为j的路径条数,从题中可以得出,要在N处的分数为K,那么那些到达N的路径上的节点的val必然是K的因子,由于K的范围为[1, 1000000],二维数组开不下,那么我们可以用一个数组来保留K的所有因子,在用一个数组来保留这个因子的值,这样,二维数组就可开了,于是,就是记忆化搜索了!
/*************************************************************************
> File Name: zoj3644.cpp
> Author: syhjh
> Created Time: 2014年03月18日 星期二 20时47分15秒
************************************************************************/
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int MAXN = ( + );
const int MAXM = ( + );
const int MAX = ( + );
const int MOD = ();
template < class T > inline T GCD(T a, T b)
{
return b == ? a : GCD(b, a % b);
} template < class T > inline T LCM(T a, T b)
{
return a / GCD(a, b) * b;
} struct Edge {
int v, next;
} edge[MAXM]; int N, M, K, val[MAXN];
int NE, head[MAXN]; void Insert(int u, int v)
{
edge[NE].v = v;
edge[NE].next = head[u];
head[u] = NE++;
} int dp[MAXN][MAXN];
int pp[MAX], num[MAXN]; void Init()
{
memset(pp, -, sizeof(pp));
int cnt = ;
for (int i = ; i <= K; i++) {
if (K % i == ) {
pp[i] = cnt;
num[cnt++] = i;
}
}
} int getDp(int u, int s)
{
if (s == -) return ;
if (u == N && num[s] == K) {
return ;
}
if (dp[u][s] != - ) return dp[u][s];
int ans = ;
for (int i = head[u]; i != -; i = edge[i].next) {
int v = edge[i].v;
if (K % val[v]) continue;
int tmp = LCM(num[s], val[v]);
if (tmp != num[s] && K % tmp == ) {
ans += getDp(v, pp[tmp]);
ans %= MOD;
}
}
return dp[u][s] = ans;
} int main()
{
while (cin >> N >> M >> K) {
NE = ;
memset(head, -, sizeof(head));
while (M--) {
int u, v;
cin >> u >> v;
Insert(u, v);
}
for (int i = ; i <= N; i++) {
cin >> val[i];
}
Init();
memset(dp, -, sizeof(dp));
cout << getDp(, pp[val[]]) << endl;
}
return ;
}
zoj 3644(dp + 记忆化搜索)的更多相关文章
- 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索
题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...
- 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索
[题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...
- [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树
树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...
- poj1664 dp记忆化搜索
http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...
- 状压DP+记忆化搜索 UVA 1252 Twenty Questions
题目传送门 /* 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 若 ...
- ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. Poor Ramzi -dp+记忆化搜索
ACM International Collegiate Programming Contest, Tishreen Collegiate Programming Contest (2017)- K. ...
- POJ 1088 DP=记忆化搜索
话说DP=记忆化搜索这句话真不是虚的. 面对这道题目,题意很简单,但是DP的时候,方向分为四个,这个时候用递推就好难写了,你很难得到当前状态的前一个真实状态,这个时候记忆化搜索就派上用场啦! 通过对四 ...
- loj 1044(dp+记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26764 思路:dp[pos]表示0-pos这段字符串最少分割的回文 ...
- DP(记忆化搜索) + AC自动机 LA 4126 Password Suspects
题目传送门 题意:训练指南P250 分析:DFS记忆化搜索,范围或者说是图是已知的字串构成的自动机图,那么用 | (1 << i)表示包含第i个字串,如果长度为len,且st == (1 ...
随机推荐
- 设计算法,求AB两个整数集合的交集
[本文链接] http://www.cnblogs.com/hellogiser/p/ab-set-intersection.html [分析] 思路1:排序法 对集合A和集合B进行排序(升序,用快排 ...
- ios Swift 一些注意事项
func test(one:NSString) -> NSString{ return "aaa" } func test(one:Int) -> NSString{ ...
- Zookeeper WINDOWS 安装配置
下载:zookeeper:http://mirrors.hust.edu.cn/apache/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gz 解压zo ...
- 网站配置好了,在本地能登录系统,但是挂在IIS上就无法登录了,提示数据库连接错误
我用的VS2010开发的网站,但是挂在本机的IIS上的时候就无法登录了,提示错误如下:
- jsonp注意事项
自己测试的: <?php '); } }); } </script> <!DOCTYPE htm ...
- library not found for -lAFNetworking
错误内容如图所示: error:linker command failed with exit code 1(use -v to see invocation) 首先报这个错的情况有很多,所以需要看e ...
- 关于 UICollectionViewCell 的一些陷阱
如果直接使用 UICollectionViewCell 的自带属性 selected 来自定义一些样式,如: - (void)setSelected:(BOOL)selected { [super s ...
- Lua程序设计入门
在Lua中,一切都是变量,除了关键字.TTMD强大了. 1.注释 -- 表示注释一行 --[[ ]]表示注释一段代码,相当于C语言的/*....*/ 注意:[[ ... ]]表示一段字符串 2.lua ...
- ios框架
iPhone OS(现在叫iOS)是iPhone, iPod touch 和 iPad 设备的操作系统. 1,Core OS: 是用FreeBSD和Mach所改写的Darwin, 是开源 ...
- sql语句的join用法
sql的join分为三种,内连接.外连接.交叉连接. 以下先建2张表,插入一些数据,后续理解起来更方便一些. create table emp(empno int, name char(20),dep ...