题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834

思路:dp[i][j]表示当前节点在i,分数为j的路径条数,从题中可以得出,要在N处的分数为K,那么那些到达N的路径上的节点的val必然是K的因子,由于K的范围为[1, 1000000],二维数组开不下,那么我们可以用一个数组来保留K的所有因子,在用一个数组来保留这个因子的值,这样,二维数组就可开了,于是,就是记忆化搜索了!

  1. /*************************************************************************
  2. > File Name: zoj3644.cpp
  3. > Author: syhjh
  4. > Created Time: 2014年03月18日 星期二 20时47分15秒
  5. ************************************************************************/
  6. #include <iostream>
  7. #include <cstdio>
  8. #include <cstring>
  9. #include <algorithm>
  10. using namespace std;
  11.  
  12. const int MAXN = ( + );
  13. const int MAXM = ( + );
  14. const int MAX = ( + );
  15. const int MOD = ();
  16. template < class T > inline T GCD(T a, T b)
  17. {
  18. return b == ? a : GCD(b, a % b);
  19. }
  20.  
  21. template < class T > inline T LCM(T a, T b)
  22. {
  23. return a / GCD(a, b) * b;
  24. }
  25.  
  26. struct Edge {
  27. int v, next;
  28. } edge[MAXM];
  29.  
  30. int N, M, K, val[MAXN];
  31. int NE, head[MAXN];
  32.  
  33. void Insert(int u, int v)
  34. {
  35. edge[NE].v = v;
  36. edge[NE].next = head[u];
  37. head[u] = NE++;
  38. }
  39.  
  40. int dp[MAXN][MAXN];
  41. int pp[MAX], num[MAXN];
  42.  
  43. void Init()
  44. {
  45. memset(pp, -, sizeof(pp));
  46. int cnt = ;
  47. for (int i = ; i <= K; i++) {
  48. if (K % i == ) {
  49. pp[i] = cnt;
  50. num[cnt++] = i;
  51. }
  52. }
  53. }
  54.  
  55. int getDp(int u, int s)
  56. {
  57. if (s == -) return ;
  58. if (u == N && num[s] == K) {
  59. return ;
  60. }
  61. if (dp[u][s] != - ) return dp[u][s];
  62. int ans = ;
  63. for (int i = head[u]; i != -; i = edge[i].next) {
  64. int v = edge[i].v;
  65. if (K % val[v]) continue;
  66. int tmp = LCM(num[s], val[v]);
  67. if (tmp != num[s] && K % tmp == ) {
  68. ans += getDp(v, pp[tmp]);
  69. ans %= MOD;
  70. }
  71. }
  72. return dp[u][s] = ans;
  73. }
  74.  
  75. int main()
  76. {
  77. while (cin >> N >> M >> K) {
  78. NE = ;
  79. memset(head, -, sizeof(head));
  80. while (M--) {
  81. int u, v;
  82. cin >> u >> v;
  83. Insert(u, v);
  84. }
  85. for (int i = ; i <= N; i++) {
  86. cin >> val[i];
  87. }
  88. Init();
  89. memset(dp, -, sizeof(dp));
  90. cout << getDp(, pp[val[]]) << endl;
  91. }
  92. return ;
  93. }

zoj 3644(dp + 记忆化搜索)的更多相关文章

  1. 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索

    题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...

  2. 【BZOJ】1415 [Noi2005]聪聪和可可 期望DP+记忆化搜索

    [题意]给定无向图,聪聪和可可各自位于一点,可可每单位时间随机向周围走一步或停留,聪聪每单位时间追两步(先走),问追到可可的期望时间.n<=1000. [算法]期望DP+记忆化搜索 [题解]首先 ...

  3. [题解](树形dp/记忆化搜索)luogu_P1040_加分二叉树

    树形dp/记忆化搜索 首先可以看出树形dp,因为第一个问题并不需要知道子树的样子, 然而第二个输出前序遍历,必须知道每个子树的根节点,需要在树形dp过程中记录,递归输出 那么如何求最大加分树——根据中 ...

  4. poj1664 dp记忆化搜索

    http://poj.org/problem?id=1664 Description 把M个相同的苹果放在N个相同的盘子里,同意有的盘子空着不放,问共同拥有多少种不同的分法?(用K表示)5.1.1和1 ...

  5. 状压DP+记忆化搜索 UVA 1252 Twenty Questions

    题目传送门 /* 题意:给出一系列的01字符串,问最少要问几个问题(列)能把它们区分出来 状态DP+记忆化搜索:dp[s1][s2]表示问题集合为s1.答案对错集合为s2时,还要问几次才能区分出来 若 ...

  6. 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. ...

  7. POJ 1088 DP=记忆化搜索

    话说DP=记忆化搜索这句话真不是虚的. 面对这道题目,题意很简单,但是DP的时候,方向分为四个,这个时候用递推就好难写了,你很难得到当前状态的前一个真实状态,这个时候记忆化搜索就派上用场啦! 通过对四 ...

  8. loj 1044(dp+记忆化搜索)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26764 思路:dp[pos]表示0-pos这段字符串最少分割的回文 ...

  9. DP(记忆化搜索) + AC自动机 LA 4126 Password Suspects

    题目传送门 题意:训练指南P250 分析:DFS记忆化搜索,范围或者说是图是已知的字串构成的自动机图,那么用 | (1 << i)表示包含第i个字串,如果长度为len,且st == (1 ...

随机推荐

  1. Apache2.4.6 添加虚拟主机

    apache2.4 与 apache2.2 的虚拟主机配置写法有所不同 apache2.2的写法: <VirtualHost *:80> ServerName domain.com Doc ...

  2. ios 引入第三方库 运行时找不到函数实现

    今天引入webtrends 这个库,结果一直运行时找不到函数,纳闷了一下午! 后来发现,是other flag没有设置对,对于那些包含category用来扩展ios原始类型的库,链接的时候需要特别的链 ...

  3. 安装m2crypto报错swig error : Unrecognized option -builtin

    M2Crypto 是最完整的为 Python 包装 OpenSSL 的 RSA,DSA,DH,EC,HMACs,消息摘要,对称密码算法(包括AES)的一个库工具.而自从 M2Crypto 升级到版本 ...

  4. ACM/ICPC 之 BFS+状态压缩(POJ1324(ZOJ1361))

    求一条蛇到(1,1)的最短路长,题目不简单,状态较多,需要考虑状态压缩,ZOJ的数据似乎比POj弱一些 POJ1324(ZOJ1361)-Holedox Moving 题意:一条已知初始状态的蛇,求其 ...

  5. js 中 toString( ) 和valueOf( )

    1.toString()方法:主要用于Array.Boolean.Date.Error.Function.Number等对象转化为字符串形式.日期类的toString()方法返回一个可读的日期和字符串 ...

  6. NEFU 504 new Flip Game (高斯消元)

    题目链接 题解:和 poj1753Filp game 差不多,区别在于t组数据并且翻转的时候多了一个左上角. #include <iostream> #include <cstdio ...

  7. 本地Yum

    1. mkdir xxx #新建文件夹 (新建一个挂载需要的文件夹) 2.配置本地yum源(挂载光盘) 3.进入 yum.repos.d 4.ls (查看当前文件夹全部的文件) 并 mv 修改   除 ...

  8. 关于Windows下的文件后缀名问题

    一.背景说明 有很多的小伙伴对windows下的文件后缀名不能很好地理解作用和区别,更不用说高深的使用了,在这里给大家说一下这些文件后缀名到底有什么区别,有什么作用呢? 二.说明 简单的说来,wind ...

  9. 高效使用你的Xcode

    (via:VongLo's Dev Space  原文:Supercharging Your Xcode Efficiency)   好莱坞电影里经常看到黑客们手指在键盘上飞速跳跃,同时终端上的代码也 ...

  10. How To Use Proguard in Android APP

    在Android开发完成即将发布给用户使用时,还有最后重要的一步:代码混淆,这时候,Proguard就派上用场了,大家谁也不想辛辛苦苦写的代码太容易被别人反编译过来,而Proguard就是帮我们实现这 ...