DAG图。

  1. 【题意】
  2. n(50)个城市m(c(n,2))条单向边(x,y),保证x<y
  3. 对于三个点(x,y,z)如果abs(w[x]-w[y])<=K && abs(w[x]-w[y])<=K && abs(w[x]-w[y])<=K则这是一个合法状态。
  4. 问你,如果我们从(x,y,z)出发,可以在合法状态中任意行走任意终止,有多少种不同的行走路径数

f[i][j][k] = ∑f[ii][jj][kk],ii,jj,kk分别为i,j,k的直接后继

时间复杂度是O(n^6)的,需要优化。

另开一维枚举当前要走的人。

我们假定先走k,再走j,最后走i,目前在i,j,k。

f[i][j][k][0]表示k,j,i走完下一轮继续走k,j,i的方案数f[u][j][k][2] += f[i][j][k][0];

f[i][j][k][1]表示k走完下一步走j,再走i的方案数f[i][u][k][1] += f[i][j][k][2];

f[i][j][k][2]表示k,j走完下一步走i的方案数f[i][j][u][0] += f[i][j][k][1];

倒着dp

  1. 具体转移是这样子的——
  2. if (!ok(i, j) || !ok(i, k) || !ok(j, k))f[i][j][k][0] = 0;
  3. else gadd(f[i][j][k][0], 1);
  4. //这个DP的起点条件并不一定是要满足ok(i,j)&&ok(i,k)&&ok(j,k),因为这个状态可能是中途状态
  5. if (f[i][j][k][0])
  6. for (int u = 1; u < i; ++u)if (e[u][i])
  7. gadd(f[u][j][k][2], f[i][j][k][0]);
  8. if(f[i][j][k][2])
  9. for (int u = 1; u < j; ++u)if (e[u][j])
  10. gadd(f[i][u][k][1], f[i][j][k][2]);
  11. if(f[i][j][k][1])
  12. for (int u = 1; u < k; ++u)if (e[u][k])
  13. gadd(f[i][j][u][0], f[i][j][k][1]);
  1. 【题意】
  2. n(50)个城市m(c(n,2))条单向边(x,y),保证x<y
  3. 对于三个点(x,y,z)如果abs(w[x]-w[y])<=K && abs(w[x]-w[y])<=K && abs(w[x]-w[y])<=K则这是一个合法状态。
  4. 问你,如果我们从(x,y,z)出发,可以在合法状态中任意行走任意终止,有多少种不同的行走路径数
  5. 【类型】
  6. 分段式DP 打破题目约束
  7. 【分析】
  8. 这道题可以AC的复杂度最多只能为O(n^4)
  9. 而一个状态是O(n^3),如果我们暴力枚举两个状态,并做转移,复杂度是O(n^6)的。
  10. 于是我们要尝试优化——
  11. 我们发现,我们在转移的时候,可以考虑的不再是三重循环转移,而是分步式转移。
  12. 即,虽然题目要求是三个人同时走,但是我们可以把其转化为三个人轮流走的情况。
  13. 因为同时走的复杂度是是要做三种枚举。所以我们定义状态的一二三步
  14. 即f[i][j][k][0]表示,下一步是i走
  15. 即f[i][j][k][1]表示,下一步是j走
  16. 即f[i][j][k][2]表示,下一步是k走
  17. 这样答案的输出是f[i][j][k][0],这时三个人步长相同。
  18. 因为我们计算的时候,按照基本转移方程,f[i][j][k]+=f[ii][jj][kk],(ii,jj,kk)是(i,j,k)的合法后继
  19. 所以,(i,j,k)较大的要先算出来。于是我们倒着展开DP。
  20. 具体转移是这样子的——
  21. if (!ok(i, j) || !ok(i, k) || !ok(j, k))f[i][j][k][0] = 0;
  22. else gadd(f[i][j][k][0], 1);
  23. //这个DP的起点条件并不一定是要满足ok(i,j)&&ok(i,k)&&ok(j,k),因为这个状态可能是中途状态
  24. if (f[i][j][k][0])
  25. for (int u = 1; u < i; ++u)if (e[u][i])
  26. gadd(f[u][j][k][2], f[i][j][k][0]);
  27. if(f[i][j][k][2])
  28. for (int u = 1; u < j; ++u)if (e[u][j])
  29. gadd(f[i][u][k][1], f[i][j][k][2]);
  30. if(f[i][j][k][1])
  31. for (int u = 1; u < k; ++u)if (e[u][k])
  32. gadd(f[i][j][u][0], f[i][j][k][1]);
  33. 【时间复杂度&&优化】
  34. O(n^4)

HDU5807分段dp的更多相关文章

  1. hdu_5807_Keep In Touch(分段dp)

    题目链接:hdu_5807_Keep In Touch 题意: 在Byteland一共有nn个城市,编号依次为11到nn,同时有mm条单向道路连接着这些城市,其中第ii条道路的起点为u_iu​i​​, ...

  2. hdu3480 Division(dp平行四边形优化)

    题意:将n个数分成m段,每段的代价为最大值减最小值的平方,为代价最小是多少n<=10000 ,m<=5000 题解:先拍好序,从小到大,这样绝对是花费最小的,不过怎么样来做呢?一定很容易想 ...

  3. BZOJ3193 [JLOI2013]地形生成 【dp】

    题目链接 BZOJ3193 题解 注意\(key\)是小于 第一问,显然按高度降序排序,逐个插入 如果高度各不相同,那么之前插入的都比当前插入的\(i\)大,可插入的位置个数就确定了 由于存在高度相同 ...

  4. BZOJ1090: [SCOI2003]字符串折叠

    区间dp. 一种是分段dp[i][j]=min(dp[i][j],dp[i][k]+dp[k+1][j]); 一种是这一段可以缩写dp[i][j]=min(dp[i][j],dp[i][l]+2+ca ...

  5. 2326: [HNOI2011]数学作业 - BZOJ

    首先是DP,分段DP(按位数讨论) 然后每一段构造出它对应的矩阵,用矩阵快速幂加速 type matrix=..,..]of int64; var n,m:int64; a,b,c,d:matrix; ...

  6. Educational Codeforces Round 62 (Rated for Div. 2)

    A. Detective Book 题意:一个人读书  给出每一章埋的坑在第几页可以填完 . 一个人一天如果不填完坑他就会一直看 问几天能把这本书看完 思路:模拟一下 取一下过程中最大的坑的页数  如 ...

  7. BZOJ题目(持续更新)

    bzoj1009:kmp想法+递推+矩阵快速幂.很好的想法,考虑用长串去kmp匹配短串,dp[i][j]表示匹配指针分别指在i.j位置时候,前i位母字符串一共有多少种可能性,那么dp[i][j]=Σd ...

  8. 2017多校Round3(hdu6056~hdu6066)

    补题进度:7/11 1001 待填坑 1002 待填坑 1003(set) 题意: 给定长度为n(n<=5e5)的数组(是n的一个排列)和一个整数k(k<=80),f[l,r]定义为区间[ ...

  9. poj 3744 题解

    题目 题意: $ yyf $ 一开始在 $ 1 $ 号节点他要通过一条有 $ n $ 个地雷的道路,每次前进他有 $ p $ 的概率前进一步,有 $ 1-p $ 的概率前进两步,问他不领盒饭的概率. ...

随机推荐

  1. mysql5.5.x升级到mysql5.6.x

    大概步骤是: 把配置文件添加:skip-grant-tables参数,把basedir升级成新版本,启动mysql,执行命令:mysql_upgrade升级一下字典信息,然后flush privile ...

  2. 更改printk打印级别

    1.查看当前控制台的打印级别 cat /proc/sys/kernel/printk 4    4    1    7 其中第一个"4"表示内核打印函数printk的打印级别,只有 ...

  3. [转] Xcode4.4.1下安装高德地图详细教程

    转载地址:http://blog.csdn.net/mad1989/article/details/7913404 此教程和官方的没有太大区别,省略了好多没用的步骤,添加framework的方式是最新 ...

  4. poj3263 Tallest Cow

    题意略去. 考虑给定的R对pair(A, B). 即A能看见B,这意味着B不比A低,并且区间内部的所有元素的高度严格小于A的高度. 我们规定区间的方向:若A > B,为反方向,反之称为正方向. ...

  5. Emag eht htiw Em Pleh 分类: POJ 2015-06-29 18:54 10人阅读 评论(0) 收藏

    Emag eht htiw Em Pleh Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 2937   Accepted: ...

  6. HDU(1175),连连看,BFS

    题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=1175 越学越不会,BFS还是很高级的. 连连看 Time Limit: 20000/100 ...

  7. reactjs入门到实战(三)---- 组件详解

    owner  >>> 传递 props this >>>是默认指向组件本身 key>>>不能没有,在复用的情况下 组件:例子 <!-- 输入 ...

  8. OS开发(Objective-C)常用库索引

    code4app.com 这网站不错,收集各种 iOS App 开发可以用到的代码示例 cocoacontrols.com/ 英文版本的lib收集 objclibs.com/ 精品lib的收集网站 h ...

  9. 关于三星A7屏幕锁已由管理员、加密政策,或证书存储禁用

    解决办法:设定-安全-清除证书-再返回锁定屏幕-把密码锁定-改为滑动.....

  10. jQuery模拟鼠标点击事件失效的问题

    最近使用jQuery操作浏览器获取数据,需要对分页的信息进行处理,发现直接使用$('div#pager a.next').click();的这种写法无法触发点击事件. 使用trigger('click ...