题目链接:http://poj.org/problem?id=3249

题意:

给你一个DAG图,问你入度为0的点到出度为0的点的最长路是多少

思路:

记忆化搜索,注意v[i]可以是负的,所以初始值要-inf。

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. using namespace std;
  5. const int N = 1e5 + ;
  6. typedef long long LL;
  7. struct Edge {
  8. int next, to;
  9. }edge[N * ];
  10. LL dp[N], a[N], inf = 1e12;
  11. int head[N], tot, input[N];
  12.  
  13. void init(int n) {
  14. for(int i = ; i <= n; ++i) {
  15. head[i] = -;
  16. dp[i] = -inf;
  17. input[i] = ;
  18. }
  19. tot = ;
  20. }
  21.  
  22. inline void add(int u, int v) {
  23. edge[tot].next = head[u];
  24. edge[tot].to = v;
  25. head[u] = tot++;
  26. }
  27.  
  28. void dfs(int u) {
  29. if(dp[u] != -inf)
  30. return ;
  31. for(int i = head[u]; ~i; i = edge[i].next) {
  32. int v = edge[i].to;
  33. dfs(v);
  34. dp[u] = max(dp[v] + a[u], dp[u]);
  35. }
  36. if(dp[u] == -inf) //若是出度为0
  37. dp[u] = a[u];
  38. }
  39.  
  40. int main()
  41. {
  42. int n, m;
  43. while(~scanf("%d %d", &n, &m)) {
  44. for(int i = ; i <= n; ++i) {
  45. scanf("%lld", a + i);
  46. }
  47. init(n);
  48. int u, v;
  49. for(int i = ; i <= m; ++i) {
  50. scanf("%d %d", &u, &v);
  51. add(u, v);
  52. input[v]++;
  53. }
  54. LL Max = -inf;
  55. for(int i = ; i <= n; ++i) {
  56. if(!input[i]) {
  57. dfs(i);
  58. Max = max(Max, dp[i]);
  59. }
  60. }
  61. printf("%lld\n", Max);
  62. }
  63. return ;
  64. }

POJ 3249 Test for Job (dfs + dp)的更多相关文章

  1. POJ 3249 Test for Job (拓扑排序+DP)

    POJ 3249 Test for Job (拓扑排序+DP) <题目链接> 题目大意: 给定一个有向图(图不一定连通),每个点都有点权(可能为负),让你求出从源点走向汇点的路径上的最大点 ...

  2. POJ 1321-棋盘问题(DFS 递归)

    POJ 1321-棋盘问题 K - DFS Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I6 ...

  3. dfs+dp思想的结合------hdu1078

    首先是题目的意思: 从一个正方形的0,0点开始走,只能横着走,竖着走,最多走k步,下一个点的数一定要比当前这个点的值大,每走一步,就加上下一个点的数据,问数据最大能有多少. 首先遇到这种题目,走来走去 ...

  4. HDU1978How Many Ways 记忆化dfs+dp

    /*记忆化dfs+dp dp[i][j]代表达到这个点的所有路的条数,那么所有到达终点的路的总数就是这dp[1][1]加上所有他所能到达的点的 所有路的总数 */ #include<stdio. ...

  5. poj - 1953 - World Cup Noise(dp)

    题意:n位长的01序列(0 < n < 45),但不能出现连续的两个1,问序列有多少种. 题目链接:id=1953" target="_blank">h ...

  6. 记忆化搜索(DFS+DP) URAL 1223 Chernobyl’ Eagle on a Roof

    题目传送门 /* 记忆化搜索(DFS+DP):dp[x][y] 表示x个蛋,在y楼扔后所需要的实验次数 ans = min (ans, max (dp[x][y-i], dp[x-1][i-1]) + ...

  7. 记忆化搜索(DFS+DP) URAL 1501 Sense of Beauty

    题目传送门 /* 题意:给了两堆牌,每次从首部取出一张牌,按颜色分配到两个新堆,分配过程两新堆的总数差不大于1 记忆化搜索(DFS+DP):我们思考如果我们将连续的两个操作看成一个集体操作,那么这个操 ...

  8. 【cf1111】C. Creative Snap (dfs+dp)

    传送门 简单的dfs+dp即可解决.根本不用动态开点 /* * Author: heyuhhh * Created Time: 2019/11/13 10:12:42 */ #include < ...

  9. poj 3249(bfs+dp或者记忆化搜索)

    题目链接:http://poj.org/problem?id=3249 思路:dp[i]表示到点i的最大收益,初始化为-inf,然后从入度为0点开始bfs就可以了,一开始一直TLE,然后优化了好久才4 ...

随机推荐

  1. Not a git repository (or any of the parent directories): .git解决

    首先git init .然后在执行就行了.意思应该是当前目录不是git.

  2. thinkphp3.2.3多图上传并且生成多张缩略图

    html部分 <!DOCTYPE html><html><head><meta http-equiv="Content-Type" con ...

  3. sqlserver导入dbf文件

    select top 10000 * from OPENROWSET('MICROSOFT.JET.OLEDB.4.0','dBase IV;HDR=NO;IMEX=2;DATABASE=E:/日常/ ...

  4. tail /grep/more

    1.tail -f 文件名 不断的刷新日志信息,实时的得到新追加到文件中的信息,常用来跟踪日志文件,如tail -f err.log Ctrl+C退出 2.grep '内容' 文件名 3.more 分 ...

  5. BZOJ 1564 :[NOI2009]二叉查找树(树型DP)

    二叉查找树 [题目描述] 已知一棵特殊的二叉查找树.根据定义,该二叉查找树中每个结点的数据值都比它左儿子结点的数据值大,而比它右儿子结点的数据值小. 另一方面,这棵查找树中每个结点都有一个权值,每个结 ...

  6. C#如何定义一个变长的一维和二维数组

    1.假设将要定义数组的长度为程序执行过程中计算出来的MAX List<int> Arc = new List<int>(); ; i < MAX; i++) { Arc. ...

  7. git下载其他人分支的代码

    1. 在工作空间,右键,打开Git Bash 2. clone主分支的代码(即下载主分支代码的过程) 执行命令: git clone xxx.git 3. 进入工程目录 cd   xxx 4. 切换到 ...

  8. 急速安装Ubuntu/windows双操作系统

    本文出自:http://www.cnblogs.com/svitter FAQ 因为很多人都不看FAQ,比如像我,所以直接把FAQ写在最前面,然后把正文卸载最后面逼你看- - 常用软件下载(官网) d ...

  9. dockerfile 镜像构建

    1.镜像的构建有手动与自动方式,这里我们介绍自动化的构建方式 ,dockerfile常用指令如下 2.构建指令build Usage: docker image build [OPTIONS] PAT ...

  10. 最长k可重区间集(cogs 743)

    «问题描述:«编程任务:对于给定的开区间集合I和正整数k,计算开区间集合I的最长k可重区间集的长度.«数据输入:由文件interv.in提供输入数据.文件的第1 行有2 个正整数n和k,分别表示开区间 ...