
dp
TIMELIMITE
Time is not enough. I must hurry up !
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
leetcode 300 最长递增子序列 动态规划+二分优化
// 经典dp // dp[i]表示以i为结尾的最长公共子序列长度 // dp[i] = max(dp[j]) + 1 if (a[i] > a[j]) // 否则dp[i] = 1 // 优化版在后面 //class Solution { //public: // int lengthOfLIS(vector<int>& nums) { // int n = nums.size(); // vector<int> dp(n + 1.原创 2022-04-10 11:18:02 · 832 阅读 · 0 评论 -
leetcode 139 单词拆分 一维dp
// dp[i]表示1到i是否能拼成 // dp[i] = dp[i] | dp[j] if (j, i)能找到单词匹配 class Solution { public: bool wordBreak(string s, vector<string>& wordDict) { int n = s.length(); vector<bool> dp(n + 1); dp[0] = true; for (.原创 2022-04-10 10:18:58 · 182 阅读 · 0 评论 -
leetcode 91 解码方法 动态规划 递推
// 各种特殊情况处理 // 选择从右往左,从左往右也是一样 class Solution { public: int numDecodings(string s) { int n = s.length(); if (s[0] == '0') return 0; vector<int> dp(n); dp[n - 1] = 1; for (int i = n - 2; i >= 0; i--) { .原创 2022-04-10 01:42:22 · 1131 阅读 · 0 评论 -
leetcode 413 等差数列划分 动态规划 简单递推
// 递推, 每个数除了第一个,都可形成长度为2的序列 // 如果差值和之前相同, 那么序列加一, 否则长度为2 // 倒着找最长的, 每段长度L的序列数为(L - 2) * (L - 1) / 2 class Solution { public: int numberOfArithmeticSlices(vector<int>& nums) { int n = nums.size(); vector<int> dp(n); .原创 2022-04-10 00:49:11 · 666 阅读 · 0 评论 -
Leetcode 337 打家劫舍三 (树形dp)
简单树形dp原创 2022-04-09 22:30:14 · 397 阅读 · 0 评论 -
hdu 5489 Removed Interval LIS变形
// hdu 5489 Removed Interval LIS变形 // // 解题思路: // f[i]为以a[i]为结尾的LIS // g[i]为以a[i]为开头的LIS // 对于截掉一段L而言,我们可以设将i位置前的L去除,但是 // 保留i的这样的状态.这样dp[i] = max(dp[j]) (1<=j<=i-L) + g[i] // 再对dp[i]选出一个max就是最后的原创 2015-09-29 16:04:09 · 584 阅读 · 0 评论 -
uva 12186 Another Crisis 树形dp
// uva 12186 Another Crisis 树形dp // // 对于一个节点u,有k个子节点,则至少有c = (k * T - 1) / 100 + 1才能 // 发信,即c / k >= T / 100,则 c 的值为 k * T /100,上取整变成上式 // 将所有的子节点d从小到大排序,取前c个就是d[u]的值 // 紫书上的一题,之前看了好久好久,觉得挺好的,然而一直原创 2015-08-05 20:45:29 · 704 阅读 · 0 评论 -
2015 Multi-University Training Contest 2 1004 苹果树 dp+单调队列
// 仅以此题,表示自己的成长之路 // 多校的一道题目, // 题意在一个圆上有n棵苹果树,每个苹果树上有a[i]个苹果 // 从起点0出发,告诉你圆的周长L,你有一个篮子,容量为k //求从起点0出发将所有苹果树 上的苹果都搬到0处所花费的最小的距离。 // 解题思路 // 最开始我想到的是训练指南上的捡垃圾的dp那道题目, // 不过一个是一维轴,一个是二维坐标,就类比了一下 // 怪原创 2015-07-23 19:16:48 · 593 阅读 · 0 评论 -
Codeforces #316 E Pig and Palindromes DP
// Codeforces #316 E Pig and Palindromes // // 题目大意: // // 给你一张地图,n*m每个点是一个字母,现在从(0,0)出发, // 每次只能往右或者往下走,求走到(n-1,m-1)形成回文串的方法数. // // 解题思路: // // 动态规划.首先.如果起点和终点的字母不相同,那么肯定 // 不能形成回文串,直接输出0.对于能形成原创 2015-08-14 21:56:03 · 999 阅读 · 0 评论 -
uva 624 CD 01背包打印路径
// 集训终于开始了,来到水题先 #include #include #include #include using namespace std; int a[23]; int d[23][100000]; int flag[23]; int W,n; void init(){ cin >> n; for (int i=1;i<=n;i++) cin >原创 2015-07-22 11:30:53 · 946 阅读 · 0 评论 -
uva 11361 Investigating Div-Sum Property 数位dp
// uva 11361 Investigating Div-Sum Property 数位dp // // 题目大意: // // 给你一个整数a和一个整数b,问在[a,b]范围内,有多少个自身被k整除并且 // 各位数之和也能被k整除.比如k = 7 ,322满足条件,因为332能被整除7,并 // 3 + 2 + 2 = 7 也能被7整除 // // 解题思路: // // 求原创 2015-08-09 21:48:08 · 958 阅读 · 0 评论 -
uva live 3516 Exploring Pyramids 区间DP
// uva live 3516 Exploring Pyramids 区间DP // // 题目大意: // // 给你一个多叉树,每个节点是一个大写字母,从根节点走,按照先序遍历的 // 原则访问,不能访问则回溯,每次记录一下节点的字符,最后得到一个字符串.现 // 在给你一个字符串,问可能符合条件的多叉树的数量. // // 解题思路: // // 区间DP,我们注意到,从根节点出发,一原创 2015-08-07 21:40:41 · 781 阅读 · 0 评论 -
uva 11825 ,Hacker's Crackdown 状态压缩 dp
// uva 11825 Hacker's Crackdown // // 题目意思看了很久才看懂,有n台计算机,有n种服务,每台计算机上运行所有 // 的服务,并且其中有的计算机与某些计算机相互邻接,对于每台计算机, // 你可以选择一项服务,停止这项服务,则与它邻接的计算机的该服务也停止了 // 你的目的是让经量多的服务完全瘫痪 // // 换而言之,这个问题就是在n个集合中(p[1]....原创 2015-05-26 12:01:56 · 899 阅读 · 0 评论 -
uva1252 Twenty Questions 状压dp
// uva1252 Twenty Questions 状压dp // // 解题思路: // // 状压dp. // // dp[s,a]表示已经问的特征的集合为s,想象中物品的集合为a最少还要问 // 多少次.则状态转移为 // dp[s,a] = min(dp[s,a],max(dp[s+(k),a],dp[s+(k),a+(k)])+1); // 我们已经知道已询问的特征集为原创 2015-09-15 17:40:09 · 483 阅读 · 0 评论 -
uva 10618 Tango Tango Insurrection 动态规划
// uva 10618 Tango Tango Insurrection 动态规划 // // 解题思路: // // 这是看的条件最多的一个动态规划了.看了很久很久,虽然 // 状态很好理解,但是限制特别多. // d[i][a][b][s]表示到达第i个指示灯的时候,左脚在a,右脚 // 在b,上一次移动的脚为s(没有移动0,左脚1,右脚2)所需的最小花 // 费.并将四个方向分别编原创 2015-09-16 17:51:13 · 1104 阅读 · 0 评论 -
uva 1627 Team them up! 二分图 + 连通分量 + 背包
// uva 1627 Team them up! 二分图 + 连通分量 + 背包 // // 解题思路: // // 同组之内每个人相互认识,如果a和b不相互认识,则 // a和b只能分在两个不同的组.所以以不相互认识作为边 // 建图,对于每个联通块判断是否是二分图.如果不是,没有 // 方案,如果有,那么进行背包. // d[i][j]表示前i个连通块第一个队伍人数比第二个 // 队原创 2015-09-17 15:42:31 · 722 阅读 · 0 评论 -
LeetCode 64 最小路径和
// dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + dp[i][j]; // 注意初始化横竖累和 class Solution { public int minPathSum(int[][] grid) { int n = grid.length; int m = grid[0].length; ...原创 2019-08-24 16:33:31 · 273 阅读 · 0 评论 -
LeetCode 63 不同路径II
// 跟62差不多 https://blog.youkuaiyun.com/TIMELIMITE/article/details/100053683 // 就是对当前格子判断下,初始化的时候横竖碰到1就不能走了 class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) { int n = ...原创 2019-08-24 16:18:04 · 174 阅读 · 0 评论 -
LeetCode 62 不同路径
// 经典dp, dp[i][j] = dp[i - 1][j] + dp[i][j - 1]; // 注意边界 dp[1][1..n] = dp[1...n][1] = 1; // 因为只能向右和向下走 // 但是数据应该没这么强,试了下100,100都超long了... class Solution { public int uniquePaths(int m, int n) ...原创 2019-08-24 15:55:44 · 185 阅读 · 0 评论 -
LeetCode 10 正则表达式匹配 二维dp
// 这题能知道状态是怎么定义: // 常规套路 dp[i][j] 表示s串前[0,i]与p串前[0,j]匹配结果 // 但状态不知如何跳转: // 但有一种跳转一定知道, 那就是当 s[i] == p[j] 时即: // s[i] == p[j] || p[j] == '.' 时, 毫无疑问 // dp[i][j] == dp[i - 1][j - 1] // 当s[i] != p[j]时 ...原创 2019-04-22 20:36:24 · 308 阅读 · 0 评论 -
poj 1769 dp + 线段树
// 哎没想到dp啊,后续状态基于当前状态,当前状态不会影响后续状态,dp dp dp // // dp[i][j] 第i个sort的时候 最大数在j所需要的最短sort数则 // // dp[i + 1][j] = dp[i][j] 当第i段sort[si,ti] 中 ti != j (即舍弃此sort) // dp[i + 1][j] = mi...原创 2018-06-13 20:06:46 · 296 阅读 · 0 评论 -
最大子矩阵
// 最大子矩阵 // 问题 : // 给个n*m的矩阵,求元素和最大的子矩阵,元素全为负,输出0 // 思路 : // 将二维转化为一维,以最大子段和的思路。以行或者以列优先计算都可以,这里是累加列,类似将 // 行这一维压缩。思路还是挺简单的,起止位置下标也好说。 // 感悟: // 好久好久没刷题了,得捡起来了,余生,请多指教 #include #include #include #原创 2017-09-19 10:19:32 · 596 阅读 · 0 评论 -
uva 1218 Perfect Service 树形dp
// uva 1218 Perfect Service 树形dp // // 解题思路: // // d[u][0]表示节点本身是服务器 // d[u][1]表示节点的父节点是服务器 // d[u][2]表示节点的孩子是服务器 // d[u][0] = sigma(d[v][0],d[v][1]); // 自己是服务器,那么孩子可以是服务器 // // 也可以不是原创 2015-11-02 18:26:55 · 585 阅读 · 0 评论 -
hdu 3681 Prison Break bfs + 二分 + TSP
// hdu 3681 Prison Break bfs + 二分 + TSP // // 解题思路: // // 因为G,Y不超过15,这样讲这些点单独记录下来,bfs求出 // 两两之间的距离.二分用判断TSP判断.所转化的问题就是在 // F和Y的集合中,找到TSP路径的最小值即可. // // 感悟: // // 觉得这题,十分巧妙,仔细想来确实不是很难,但是不好 // 想,总的来说还原创 2015-10-15 20:39:51 · 611 阅读 · 0 评论 -
uva 10534 Wavio Sequence LIS
// uva 10534 Wavio Sequence // // 可以将题目转化为经典的LIS。 // 从左往右LIS记作d[i],从右往左LIS记作p[i]; // 则最后其中的min(d[i],p[i])就是这个波动序列的一半 // 在这最后的min(d[i],p[i]) * 2 + 1 的最大值就是我们所要求的答案 // // 这题开始想的最后的答案是d[i]==p[i]的时候求最大。原创 2015-06-11 13:39:45 · 641 阅读 · 0 评论 -
uva 11552 Fewest Flops 线性dp
// uva 11552 Fewest Flops // // 二维线性dp // // 首先,块内肯定是相同的字母放在一起,先记录下每个块内有多少种字母 // 记作counts[i]; // // 令f[i][j]表示前i个块以字母j为结尾的最小分块数 // // 如果第i块的开始字母与第i-1块的结束字母相同 // f[i][j] = min(f[i][j],f[i-1][k] + coun原创 2015-06-11 21:56:10 · 714 阅读 · 0 评论 -
uva1626 poj 1141 Brackets Sequence 区间dp 打印路径
// poj 1141 Brackets Sequence // 也是在紫书上看的一题,uva就是多了一个t组数据。 // 经典区间dp // dp(i,j)表示区间[i,j]内所需要增加的括号数目 // 则分为两种情况 // 一种是s[i]和s[j]是匹配的则 // dp[i][j] = min(dp[i][j],dp[i+1][j-1]) // 另外一种情况是不匹配 // dp[i][j] =原创 2015-05-04 23:00:54 · 860 阅读 · 0 评论 -
uva348 最优矩阵链乘 经典区间dp
// uva348 最优矩阵链乘 // 典型的区间dp // dp[i][j] 表示矩阵i到j链乘所得到的最小花费 // dp[i][j] = min(dp[i][k]+dp[k+1][j]+a[i].pl*a[k].pr*a[j].pr); // 在区间i到j上找一个k使得dp[i][k]+dp[k+1][j]这两部分的和在加上最后的 // a[i].pl*a[k].pr*p[i].pr的最小值原创 2015-04-28 21:19:23 · 835 阅读 · 0 评论 -
poj2955 Brackets 简单区间dp
// poj2955 简单区间dp // d[i][j]表示i到j区间所能形成的最大匹配序列 // dp[i][j] = max(dp[i][k]+dp[k+1][j]){i<k<j} // dp[i][j] = max(dp[i+1][j-1]+2) if (s[i] match s[j]) // // 记忆化搜索的时候,将dp[i][i] = 0 ,其他赋值成-1; // // 做题的时候刚开原创 2015-05-09 17:33:18 · 897 阅读 · 0 评论 -
uva1625 Color Length 线性动态规划
// uva1625 Color Length // 这是好久之前在紫书(page 276)上看到的题目了 // 题目的意思是,给你两个长度分别为n和m的颜色序列(n,m<=5000) // 都是由大写字母组成,要求按照顺序合并成同一个序列,即每次 // 可以把一个序列开头的颜色放在新序列的尾部 // 比如两个序列:GGBY 和 YRRGB至少有两种合并结果: // GBYBRYRGB 和 YRR原创 2015-04-27 10:47:37 · 2188 阅读 · 0 评论 -
uva 11400 Lighting System Design dp
// uva 11400 // 首先得先明白,灯泡要么不换,要么全换,因为部分换的话 // 则还要额外花费电源的钱 // dp[i]表示前i种灯泡用最优策略所花费的最小开销 // 因为灯泡的电压只能高不能低,先按灯泡的电压升序排列 // 状态转移方程: // dp[i] = min(dp[i],dp[j]+(s[i]-s[j])*c[i]+k[i]); // s[i]表示前i种灯泡的总的数量 //原创 2015-04-21 21:12:04 · 638 阅读 · 0 评论 -
uva437 poj2241 The Tower of Babylon dp
// 这题开始在算法竞赛入门经典的书上状态表示 // dp[i][j]表示前i个方块以第j条边为高所能得到的最大高度值 // dp[i][j] = max(dp[0...i-1][0,1,2]+block[i][j]); // 就是一个DAG模型 // 这样记忆化搜索就行啦,还是有些技巧的 // // 第二种做法就是递推 // 首先把一个方块变为6个,即表示长,宽,高 // 当然,首先得要把底面积原创 2015-04-17 17:39:09 · 889 阅读 · 0 评论 -
uva 116 Unidirectional TSP dp + 打印路径
// uva116 Unidirectional TSP // 这题是在紫书(page 270)上看到的,个人理解就是数塔的升级版 // dp[i][j]表示从(i,j)出发到终点所达到的最大价值 // 所以很明显j是逆序的 // 状态转移方程为 // dp[i][j] = min(dp[i][j],dp[row[k]][j+1]+mp[i][j]) // rows[k]表示三行中的一行i,i-1原创 2015-04-21 10:11:11 · 978 阅读 · 0 评论 -
hdu 1423 Greatest Common Increasing Subsequence 经典dp
// 最长公共上升子序列问题 // 以f[i][j]表示a串前i个字符与b串前j个字符并且以b[j]为结尾匹配的状况 // 为什么定义这个状态呢,因为我也是看到的百度文库中@我们都爱刘汝佳 // 这篇文章中的介绍,发现这个状态真的非常好用 // 状态转移方程 // a[i]!=b[j]那么f[i][j] = f[i-1][j],换而言之,我们可以直接丢掉a串中 // 的a[i]不用考虑,这里和最长原创 2015-04-14 18:48:41 · 629 阅读 · 0 评论 -
uva 1347 poj 2267 Tour 最短双调回路
// uva1347 Tour 最短双调路线 // 这道题是看着紫书上面写着的 // dp[i][j]表示1至max(i,j)都已经走过时并且第一个人在i // 第二个人在j点时所要走的最短的距离,则dp[i][j] = dp[j][i] // 状态转移方程为 // dp[i+1][j] = max(dp[i][j]+dist[i][i+1],dp[i+1][i]+dist[j][i+1]) //原创 2015-04-19 00:25:48 · 2083 阅读 · 0 评论 -
hdu2844 Coins 多重背包+完全背包
//这题的意思就是有n种硬币,每种硬币有价值a和数量c //要求购买一件价值不超过m的商品,购买的时候不找零 //求可能购买的商品的价值 //典型的背包问题,价值和重量相等的背包 //dp[i][j] = max(dp[i-1][j],dp[i-1][j-a[i]]+a[i]; //但是每件物品还有数量这个属性,所以直接用多重背包 //二进制转换成一重背包做。这样直接做的结果就是,, //超时,我原创 2015-04-02 09:39:32 · 582 阅读 · 0 评论 -
uva 10003 Cutting Sticks 简单区间dp
// uva 10003 Cutting Sticks 区间dp // 经典的区间dp // dp(i,j)表示切割小木棍i-j所需要的最小花费 // 则状态转移为dp(i,j) = min{dp(i,k) + dp(k,j) + a[j]-a[i]) // 其中k>i && k<j // a[j] - a[i] 为第一刀切割的代价 // a[0] = 0,a[n+1] = L; // dp数组初原创 2015-05-01 22:54:26 · 967 阅读 · 0 评论 -
uva 1220 ,Patty at Hali-Bula 树形dp 树上最大独立集 并判断是否唯一
// uva 1220 Patty at Hali-Bula // 树上最大独立集 + 最大独立集是否唯一 // d[u][0] 表示不选该节点时的最大独立集 // d[u][1] 表示选该节点时的最大独立集 // d[u][0] = sigma max(d[v][0],d[v][1]){v是u的子节点} // d[u][1] = sigma d[v][0] // 分别表示没选该节点时,子节点原创 2015-05-05 22:19:24 · 737 阅读 · 0 评论 -
uva 10859 Placing Lampposts,树形dp
// uva 10859 Placing Lampposts // 树形dp // // 题目的意思是一个无向无环图中,有一些顶点和一些边 // 要在顶点上放置灯笼(灯笼可以照亮与它相邻接的点), // 使得所有的边都能被灯笼照亮,其中可能有一些边被两个灯笼 // 照亮,则要求使得所有边都被灯笼照亮所需灯笼的最小值, // 并且,此时边同时被两个灯笼照亮的数目应尽可能的多 // // 思路是 //原创 2015-05-28 00:59:56 · 741 阅读 · 0 评论 -
sgu 143 Long live the Queen 简单树形dp
// sgu 143 Long live the Queen 简单树形dp // // 题意:在树上选一个连通字图,使得节点的权值之和最大 // f[i] 表示以该节点为根的字图权值之和的最大值 // 则有 f[i] = w[i] + sigma(max(0,f[j])) i是j的父节点 // 最后在所有的f中挑个最大值就是答案。。。。 #include #include #includ原创 2015-05-24 15:18:42 · 748 阅读 · 0 评论