
动态规划/dp
动态规划问题
Honour Van
新款人工智障
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
POJ 2355 Railway Ticket problem
http://poj.org/problem?id=2355要点:插点更新的思路dp的初态设定要重视dp的更新顺序有时是不影响的。一维插点求单源最短路(?在s与e间进行查找如果中间经停一个车站可以一次到达终点的话,就尝试用到达这个经停加上最后一站的费用进行更新。while循环寻找可以一步到达本次终点的节点。 for (int i = s+1; i <= e; i++) { int j = s; while (dist[i] -原创 2020-12-12 01:50:14 · 251 阅读 · 0 评论 -
百练4083我爱北大 解析
百练4083我爱北大题解原创 2020-12-11 16:22:56 · 248 阅读 · 0 评论 -
洛谷 P1006传纸条 ——四维DP,以及其对应的去重方法
四维DP的典型模板题。注意其中去重使用的思路。因为两条路不能有任何重复的节点,所以这两条路必然分立在整个地图当中,其中一者i(行号)大,另一个j(列号)大。所以对于第一条路,其横纵坐标的枚举是自由的,第二者有了一定的限制。#include <bits/stdc++.h>using namespace std;int dp[52][52][52][52], a[52][52], n, m;int max(int a, int s, int d, int f)//通过重载max函数,将使得原创 2020-06-16 09:24:25 · 573 阅读 · 0 评论 -
[模板] 四维dp
luogu P1004 方格取数#include <bits/stdc++.h>using namespace std;int dp[11][11][11][11], a[11][11], n, x, y, z;int main(){ cin >> n; while (cin >> x >> y >> z && x && y && z) a[x][y] = z原创 2020-06-15 20:59:29 · 693 阅读 · 0 评论 -
洛谷 P4933 大师 dp等差提取
转载自BUAA_Wander https://buaa-wander.blog.luogu.org/solution-p4933的洛谷博客。已经本人授权。思路清晰,尤其关于状态的思考过程,描述极其清晰,详细思忖有大助益。洛谷P4933大师简单分析题目之后,发现这个题就是要我们求原数列中有多少等差子数列。观察了数据范围之后发现,本题目给出了最大高度的范围。要知道给出数据范围的量是很有可能出现在正解复杂度里的(时间或空间),所以我们尽量往这两个上面靠。由于做题不多,所以我想从仅做过的几个模板题里面借鉴一转载 2020-06-15 19:46:59 · 575 阅读 · 0 评论 -
[模板] LIS(最长上升子序列)和 LCS(最长公共子序列)
此段无比伟大而清晰的解释来自阮行止。我仅调整了B序列的顺序,使之最初不为顺序序列(因为我的代码实现在这里栽了跟斗orz)。关于(LCS)为什么可以转化成LIS问题,这里提供一个解释。比如这样的两个序列:A:3 2 1 4 5B:2 5 4 1 3我们不妨给它重新编个号,使得A的逆序为0,即3-a(3标成a),2-b,1-c,4-d,5-e。于是成为:A: a b c d eB: b e d c a这样标号后,LCS长度显然不会因此改变,毕竟没有对原有序列进行任何相对位置的改变。于是.原创 2020-06-14 20:33:38 · 485 阅读 · 0 评论 -
[pieces] nlogn的LIS(最长上升子序列)实现
使用贪心法,将第k位定义成长为k的LIS末端可能的最小值。思路如下我们构建的存储答案的数组(暂且称为dp数组),其第kkk位表示:长度为kkk的LIS中,末端元素最小的那个LIS的末端元素。①扩展情形:条件:如果要扩展出k+1k+1k+1长的LIS,那么对当前读入的tmp,必须要有长为kkk的LIS且末端元素比tmp小。事实:而我们先前已经得到长为kkk的LIS,其末端元素存储为dp[ptr-1],所以如果末端元素dp[ptr-1]比tmp小,那么就能实现前述的条件。结果:长度增加,获得更优解。原创 2020-06-13 08:54:17 · 486 阅读 · 0 评论 -
硬币找零——背包问题,以及循环、递归、动规共通性
在这个题目的基础上,我了解了一下这几个“编程写法”,并对循环、递归、dp有了新的想法。从原理上,这几个想法都是大事化小、小事化了。只不过方向不同罢了。根据The Algorithm Design Manual,解决这类存在顺序解决关系的问题,我们的通用的想法是因为递归实际上是一种更自然的思路,从已知到实现只需迈出一步。这一步也抽象了无数步的实现过程。往往更加清晰实际上我按照这套mindset来考虑dp问题之后,会发现对于并不熟悉的dp题目,明显构思起来要比直接考虑“有什么状态?怎么扩展状态”这套顺原创 2020-05-29 21:35:02 · 1078 阅读 · 0 评论 -
[pieces] 洛谷P1928, P1164:递归、基础背包
以下这两个题目代表了递推当中的两种基本思路,即递归和递推。P1928分析:这是一个分层的问题,这或许告诉我们层数适量的括号匹配可以通过递归来做,可以大大简化思考量。一份好代码:由于递归使用栈,不需要其他的数据结构来存储分层的信息,所以(?)空间复杂度更低。减少了一次性输入的时间耗费但每次读入一个字符还是很浪费时间的。#include<iostream>using namespace std;string work(){ string ret="";//记录答案 char ch原创 2020-05-22 15:33:17 · 475 阅读 · 0 评论 -
[debug][pieces] 洛谷P1002 过河卒——递归、动规复习
递归自顶向下,动规自底向上。递归对应搜索,动规对应递推。递归必须要记忆化搜索,否则会T,由于使用尾递归,在这个情形下和动规效率相差无几。个人更喜欢递归,因为清晰简洁(=______=)#include <iostream>bool tac[22][22];int m, n, hx, hy, dx[8] = {2, 1, -1, -2, -2, -1, 1, 2}, dy[8] = {1, 2, 2, 1, -1, -2, -2, -1};long long mem[21原创 2020-05-19 20:14:22 · 626 阅读 · 0 评论