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 · 782 阅读 · 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 · 139 阅读 · 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 · 1092 阅读 · 0 评论 -
leetcode 413 等差数列划分 动态规划 简单递推
// 递推, 每个数除了第一个,都可形成长度为2的序列// 如果差值和之前相同, 那么序列加一, 否则长度为2// 倒着找最长的, 每段长度L的序列数为(L - 2) * (L - 1) / 2class Solution {public: int numberOfArithmeticSlices(vector<int>& nums) { int n = nums.size(); vector<int> dp(n); .原创 2022-04-10 00:49:11 · 626 阅读 · 0 评论 -
Leetcode 337 打家劫舍三 (树形dp)
简单树形dp原创 2022-04-09 22:30:14 · 358 阅读 · 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 · 553 阅读 · 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 · 665 阅读 · 0 评论 -
2015 Multi-University Training Contest 2 1004 苹果树 dp+单调队列
// 仅以此题,表示自己的成长之路// 多校的一道题目,// 题意在一个圆上有n棵苹果树,每个苹果树上有a[i]个苹果// 从起点0出发,告诉你圆的周长L,你有一个篮子,容量为k//求从起点0出发将所有苹果树 上的苹果都搬到0处所花费的最小的距离。// 解题思路// 最开始我想到的是训练指南上的捡垃圾的dp那道题目,// 不过一个是一维轴,一个是二维坐标,就类比了一下// 怪原创 2015-07-23 19:16:48 · 558 阅读 · 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 · 961 阅读 · 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 · 911 阅读 · 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 · 849 阅读 · 0 评论 -
uva live 3516 Exploring Pyramids 区间DP
// uva live 3516 Exploring Pyramids 区间DP//// 题目大意://// 给你一个多叉树,每个节点是一个大写字母,从根节点走,按照先序遍历的// 原则访问,不能访问则回溯,每次记录一下节点的字符,最后得到一个字符串.现// 在给你一个字符串,问可能符合条件的多叉树的数量.//// 解题思路://// 区间DP,我们注意到,从根节点出发,一原创 2015-08-07 21:40:41 · 744 阅读 · 0 评论 -
uva 11825 ,Hacker's Crackdown 状态压缩 dp
// uva 11825 Hacker's Crackdown//// 题目意思看了很久才看懂,有n台计算机,有n种服务,每台计算机上运行所有// 的服务,并且其中有的计算机与某些计算机相互邻接,对于每台计算机,// 你可以选择一项服务,停止这项服务,则与它邻接的计算机的该服务也停止了// 你的目的是让经量多的服务完全瘫痪//// 换而言之,这个问题就是在n个集合中(p[1]....原创 2015-05-26 12:01:56 · 858 阅读 · 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 · 446 阅读 · 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 · 1053 阅读 · 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 · 685 阅读 · 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 · 213 阅读 · 0 评论 -
LeetCode 63 不同路径II
// 跟62差不多 https://blog.csdn.net/TIMELIMITE/article/details/100053683// 就是对当前格子判断下,初始化的时候横竖碰到1就不能走了class Solution { public int uniquePathsWithObstacles(int[][] obstacleGrid) { int n = ...原创 2019-08-24 16:18:04 · 135 阅读 · 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 · 145 阅读 · 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 · 250 阅读 · 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 · 254 阅读 · 0 评论 -
最大子矩阵
// 最大子矩阵// 问题 :// 给个n*m的矩阵,求元素和最大的子矩阵,元素全为负,输出0// 思路 :// 将二维转化为一维,以最大子段和的思路。以行或者以列优先计算都可以,这里是累加列,类似将// 行这一维压缩。思路还是挺简单的,起止位置下标也好说。// 感悟:// 好久好久没刷题了,得捡起来了,余生,请多指教#include #include #include #原创 2017-09-19 10:19:32 · 563 阅读 · 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 · 549 阅读 · 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 · 579 阅读 · 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 · 613 阅读 · 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 · 680 阅读 · 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 · 824 阅读 · 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 · 785 阅读 · 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 · 860 阅读 · 0 评论 -
uva1625 Color Length 线性动态规划
// uva1625 Color Length// 这是好久之前在紫书(page 276)上看到的题目了// 题目的意思是,给你两个长度分别为n和m的颜色序列(n,m<=5000)// 都是由大写字母组成,要求按照顺序合并成同一个序列,即每次// 可以把一个序列开头的颜色放在新序列的尾部// 比如两个序列:GGBY 和 YRRGB至少有两种合并结果:// GBYBRYRGB 和 YRR原创 2015-04-27 10:47:37 · 2149 阅读 · 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 · 614 阅读 · 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 · 857 阅读 · 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 · 939 阅读 · 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 · 603 阅读 · 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 · 2038 阅读 · 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 · 550 阅读 · 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 · 931 阅读 · 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 · 705 阅读 · 0 评论 -
uva 10859 Placing Lampposts,树形dp
// uva 10859 Placing Lampposts// 树形dp//// 题目的意思是一个无向无环图中,有一些顶点和一些边// 要在顶点上放置灯笼(灯笼可以照亮与它相邻接的点),// 使得所有的边都能被灯笼照亮,其中可能有一些边被两个灯笼// 照亮,则要求使得所有边都被灯笼照亮所需灯笼的最小值,// 并且,此时边同时被两个灯笼照亮的数目应尽可能的多//// 思路是//原创 2015-05-28 00:59:56 · 700 阅读 · 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 · 710 阅读 · 0 评论