HDU5807分段dp
DAG图。
- 【题意】
- n(50)个城市m(c(n,2))条单向边(x,y),保证x<y
- 对于三个点(x,y,z)如果abs(w[x]-w[y])<=K && abs(w[x]-w[y])<=K && abs(w[x]-w[y])<=K则这是一个合法状态。
- 问你,如果我们从(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
- 具体转移是这样子的——
- if (!ok(i, j) || !ok(i, k) || !ok(j, k))f[i][j][k][0] = 0;
- else gadd(f[i][j][k][0], 1);
- //这个DP的起点条件并不一定是要满足ok(i,j)&&ok(i,k)&&ok(j,k),因为这个状态可能是中途状态
- if (f[i][j][k][0])
- for (int u = 1; u < i; ++u)if (e[u][i])
- gadd(f[u][j][k][2], f[i][j][k][0]);
- if(f[i][j][k][2])
- for (int u = 1; u < j; ++u)if (e[u][j])
- gadd(f[i][u][k][1], f[i][j][k][2]);
- if(f[i][j][k][1])
- for (int u = 1; u < k; ++u)if (e[u][k])
- gadd(f[i][j][u][0], f[i][j][k][1]);
- 【题意】
- n(50)个城市m(c(n,2))条单向边(x,y),保证x<y
- 对于三个点(x,y,z)如果abs(w[x]-w[y])<=K && abs(w[x]-w[y])<=K && abs(w[x]-w[y])<=K则这是一个合法状态。
- 问你,如果我们从(x,y,z)出发,可以在合法状态中任意行走任意终止,有多少种不同的行走路径数
- 【类型】
- 分段式DP 打破题目约束
- 【分析】
- 这道题可以AC的复杂度最多只能为O(n^4)
- 而一个状态是O(n^3),如果我们暴力枚举两个状态,并做转移,复杂度是O(n^6)的。
- 于是我们要尝试优化——
- 我们发现,我们在转移的时候,可以考虑的不再是三重循环转移,而是分步式转移。
- 即,虽然题目要求是三个人同时走,但是我们可以把其转化为三个人轮流走的情况。
- 因为同时走的复杂度是是要做三种枚举。所以我们定义状态的一二三步
- 即f[i][j][k][0]表示,下一步是i走
- 即f[i][j][k][1]表示,下一步是j走
- 即f[i][j][k][2]表示,下一步是k走
- 这样答案的输出是f[i][j][k][0],这时三个人步长相同。
- 因为我们计算的时候,按照基本转移方程,f[i][j][k]+=f[ii][jj][kk],(ii,jj,kk)是(i,j,k)的合法后继
- 所以,(i,j,k)较大的要先算出来。于是我们倒着展开DP。
- 具体转移是这样子的——
- if (!ok(i, j) || !ok(i, k) || !ok(j, k))f[i][j][k][0] = 0;
- else gadd(f[i][j][k][0], 1);
- //这个DP的起点条件并不一定是要满足ok(i,j)&&ok(i,k)&&ok(j,k),因为这个状态可能是中途状态
- if (f[i][j][k][0])
- for (int u = 1; u < i; ++u)if (e[u][i])
- gadd(f[u][j][k][2], f[i][j][k][0]);
- if(f[i][j][k][2])
- for (int u = 1; u < j; ++u)if (e[u][j])
- gadd(f[i][u][k][1], f[i][j][k][2]);
- if(f[i][j][k][1])
- for (int u = 1; u < k; ++u)if (e[u][k])
- gadd(f[i][j][u][0], f[i][j][k][1]);
- 【时间复杂度&&优化】
- O(n^4)
HDU5807分段dp的更多相关文章
- hdu_5807_Keep In Touch(分段dp)
题目链接:hdu_5807_Keep In Touch 题意: 在Byteland一共有nn个城市,编号依次为11到nn,同时有mm条单向道路连接着这些城市,其中第ii条道路的起点为u_iui, ...
- hdu3480 Division(dp平行四边形优化)
题意:将n个数分成m段,每段的代价为最大值减最小值的平方,为代价最小是多少n<=10000 ,m<=5000 题解:先拍好序,从小到大,这样绝对是花费最小的,不过怎么样来做呢?一定很容易想 ...
- BZOJ3193 [JLOI2013]地形生成 【dp】
题目链接 BZOJ3193 题解 注意\(key\)是小于 第一问,显然按高度降序排序,逐个插入 如果高度各不相同,那么之前插入的都比当前插入的\(i\)大,可插入的位置个数就确定了 由于存在高度相同 ...
- 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 ...
- 2326: [HNOI2011]数学作业 - BZOJ
首先是DP,分段DP(按位数讨论) 然后每一段构造出它对应的矩阵,用矩阵快速幂加速 type matrix=..,..]of int64; var n,m:int64; a,b,c,d:matrix; ...
- Educational Codeforces Round 62 (Rated for Div. 2)
A. Detective Book 题意:一个人读书 给出每一章埋的坑在第几页可以填完 . 一个人一天如果不填完坑他就会一直看 问几天能把这本书看完 思路:模拟一下 取一下过程中最大的坑的页数 如 ...
- BZOJ题目(持续更新)
bzoj1009:kmp想法+递推+矩阵快速幂.很好的想法,考虑用长串去kmp匹配短串,dp[i][j]表示匹配指针分别指在i.j位置时候,前i位母字符串一共有多少种可能性,那么dp[i][j]=Σd ...
- 2017多校Round3(hdu6056~hdu6066)
补题进度:7/11 1001 待填坑 1002 待填坑 1003(set) 题意: 给定长度为n(n<=5e5)的数组(是n的一个排列)和一个整数k(k<=80),f[l,r]定义为区间[ ...
- poj 3744 题解
题目 题意: $ yyf $ 一开始在 $ 1 $ 号节点他要通过一条有 $ n $ 个地雷的道路,每次前进他有 $ p $ 的概率前进一步,有 $ 1-p $ 的概率前进两步,问他不领盒饭的概率. ...
随机推荐
- Redis整合Spring结合使用缓存实例
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka 摘要:本文介绍了如何在Spring中配置redis,并通过Spring中AOP的思想,将缓存的 ...
- JavaEE基础(十六)/集合
1.集合框架(去除ArrayList中重复字符串元素方式) A:案例演示 需求:ArrayList去除集合中字符串的重复值(字符串的内容相同) 思路:创建新集合方式 /** * A:案例演示 * 需求 ...
- ios tabbar 文字位置
[nav.tabBarItem setTitlePositionAdjustment)];
- 【转载】使用barman备份PostgreSQL
什么是barman Barman (备份和恢复管理器) 是 PostgreSQL 数据库服务器中非常方便的备份和恢复工具,允许远程备份多个服务器,允许从一个备份集中一个命令就恢复数据库.同时还可以对多 ...
- AngularJS 用 Interceptors 来统一处理 HTTP 请求和响应
Web 开发中,除了数据操作之外,最频繁的就是发起和处理各种 HTTP 请求了,加上 HTTP 请求又是异步的,如果在每个请求中来单独捕获各种常规错误,处理各类自定义错误,那将会有大量的功能类似的代码 ...
- [lua]lua简介
在这篇文章中,我想向大家介绍如何进行Lua程序设计.我假设大家都学过至少一门编程语言,比如Basic或C,特别是C.因为Lua的最大用途是在宿主程序中作为脚本使用的. Lua 的语法比较简单,学习起来 ...
- IIS装好后,局域网不能访问
IIS默认安装完成后,可以通过http:\\localhost或http:\\127.0.0.1或者http:\\ip地址访问,但是局域网内却不能通过IP来访问,通常只需要将防火墙关掉就好了,也在在防 ...
- 使用自定义材质球,实现NGUI屏幕溶解和灰显
UITexture实现的溶解: 重设UITeture的材质球实现上述效果,把当前屏幕渲染的Texture2D丢给UITexture,即可实现UI屏幕特效,背景模糊等都可以. 难点主要是实时刷新问题 解 ...
- TestNG测试框架在基于Selenium进行的web自动化测试中的应用
转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/ TestNG+Selenium+Ant TestNG这个测试框架可以很好的和基于Selenium的 ...
- Android中直播视频技术探究之---桌面屏幕视频数据源采集功能分析
一.前言 之前介绍了Android直播视频中一种视频源数据采集:摄像头Camera视频数据采集分析 中介绍了利用Camera的回调机制,获取摄像头的每一帧数据,然后进行二次处理进行推流.现在我们在介绍 ...