YunYan

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

随笔分类 -  算法---动态规划

摘要:第一种解法:二维前缀和暴力 维护一个二维的前缀和f[i][j]表示从(1,1)到(i,j)的正方形矩阵的和。f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1] 然后枚举每个点,并假设该点为右下角顶点,然后枚举正方形长度判断满不满足条件即可,条件为:f[i][j]-f[i- 阅读全文
posted @ 2020-09-08 22:27 Target--fly 阅读(617) 评论(0) 推荐(0)

摘要:第一种思路:dp 假设我们考虑到第i个数,如果说这个数是正数,我们希望第i-1个数也是个正数,越大越好,如果说第i个数是个负数,我们希望第i-1个数也是个负数,并且越小越好。 所以应该同时维护两个dp数组,dp1[i]以i结尾的连续元素的最大值,dp2[i]表示以i结尾的连续元素的最小值。 转移方程 阅读全文
posted @ 2020-09-07 14:49 Target--fly 阅读(196) 评论(0) 推荐(0)

摘要:《背包九讲》 前言: 背包问题:有n件物品,每件物品有一定的价值,获取每件物品都需要一定的代价,背包问题就是在遵守一定的规则的情况下,获取最高的价值。 1,01背包 最基本的背包问题,其规则为每件物品要么选,要么不选。 定义状状态数组dp[i][j]表示前i个物品,当背包的容量为j时,背包可以容纳的 阅读全文
posted @ 2020-08-21 08:38 Target--fly 阅读(671) 评论(0) 推荐(0)

摘要:题目大意:n个人要买东西,然后每个人可以选择自己购买,花费的时间是ai,也可以选择和自己前边的人一块购买这两个人一块买花费的时间是bi,问这n个人需要的最少时间,如果从08:00:00开始算起,那么最早几点结束。 题解:定义状态dp[i]表示前i个人的需要的最少时间,第i个人可以自己买dp[i]=d 阅读全文
posted @ 2020-05-30 22:51 Target--fly 阅读(175) 评论(0) 推荐(0)

摘要:中文题目,题意好理解。 题解:定义状态DP[i][j]表示第i秒在第j个位置处的最优状态,每一个点只能由相邻点转移,所以转移方程就是dp[i][j]=max({dp[i-1][j],dp[i-1][j-1],dp[i-1][j+1]})+arr[i][j],arr[i][j]表示当前状态下的物品的数 阅读全文
posted @ 2020-05-30 22:41 Target--fly 阅读(149) 评论(0) 推荐(0)

摘要:题目大意: 给出一个序列,然后求这个序列的最大上升子序列的和。 题解:定义状态dp[i]表示前i个数的最大和,dp[i]的最小值应该是arr[i]了,因为i前边可能有负数,对于负数,虽然可以构成上升子序列,但是没有必要选。 code: #include<bits/stdc++.h> using na 阅读全文
posted @ 2020-05-25 18:43 Target--fly 阅读(158) 评论(0) 推荐(0)

摘要:题意:一个n*m的矩阵,每一个位置都有一定的高度,要求从(1,1)走到(n,m)并且每次移动只能向下或者向右移动,并且要求只能向比自己高度高1的位置移动。定义一个操作:执行一次可以使得任意一个格子的额高度减一,问从1,1到n,m操作的最少次数。 题解:首先一定会有一个格子的高度保持不变,设h(i,j 阅读全文
posted @ 2020-05-22 20:29 Target--fly 阅读(307) 评论(0) 推荐(0)

摘要:例题: LeetCode 5 最长回文子串 LeetCode 516 最长回文子序列 Acwing 石子归并 最长回文子串: 定义状态dp[i][j]表示区间i~j是一段回文串,如果dp[i][j]是回文串的话,s[i]=s[j]并且dp[i-1][j-1](i != j)是个回文串,所以说转台转移 阅读全文
posted @ 2020-05-16 11:47 Target--fly 阅读(165) 评论(0) 推荐(0)

摘要:题目大意:从n个数里边选n/2个数,问和最大是多少。 题解:这是一个比较有意思的DP,定义状态dp[i][1],表示选了第i个数的最优状态,dp[i][0]表示没有选第i个数的最优状态。 状态是如何转移的呢? 1 2 3 4 5 6 7.... 假设考虑到第7个数,前7个数我们要选7/2=3个数。 阅读全文
posted @ 2020-04-14 14:54 Target--fly 阅读(139) 评论(0) 推荐(0)

摘要:题目大意: 一共有61个位置,标记为0~60。其中有10个重要位置,分别为:5, 12, 22, 29, 33, 38, 42, 46, 50 and 55。 有一个筛子,一共6个面,标有1~6。摇到几走几步,开始的位置是在0,一共可以要10次。 输入筛子摇出每个面的概率,输出经过这10个重要位置的 阅读全文
posted @ 2020-03-26 14:53 Target--fly 阅读(117) 评论(0) 推荐(0)

摘要:两种思路: 1 单调栈:维护一个单调非递减栈,当栈为空或者当前元素大于等于栈顶元素时就入栈,当前元素小于栈顶元素时就出栈,出栈的同时计算当前值,当前值所包含的区间范围为从当前栈顶元素到当前元素i的距离加上栈顶元素到第二个栈顶元素的距离。 code: #include<bits/stdc++.h> u 阅读全文
posted @ 2020-03-22 16:08 Target--fly 阅读(144) 评论(0) 推荐(0)

摘要:简单dp。 题目大意:有n种珍珠,这n种珍珠有不同的需求量,不同的价格,价格越高,质量越高,在购买每一种珍珠时,都需要在原来的基础上多买10个。也就是说如果需要买x种珍珠,那就要付x+10个的钱。每一种珍珠必须购买大于等于自身价格的珍珠 输入一个t(100以内)表示t组测试,一个n,n种珍珠,a[i 阅读全文
posted @ 2020-03-20 16:42 Target--fly 阅读(123) 评论(0) 推荐(0)

摘要:题目大意: 插入最少的字符,使原字符串成为回文串。 题解: LCS问题,将字符串反转,然后求这俩字符串的LCS,总长度减去LCS即可(多组输入)。 N最大是5E3,直接用二维数组会超内存。所以要用到滚动数组。 code: #include<bits/stdc++.h> using namespace 阅读全文
posted @ 2020-03-19 19:34 Target--fly 阅读(90) 评论(0) 推荐(0)

摘要:题目大意:每一个城市都有一定的魅力值,然后有一个有向图,根据这个有向图从1到n+1所获得的魅力的最大值,并输出路径(要求只能从编号娇小的城市到编号较大的城市)。 题解:很容易想到最短路+路径纪录。但是感觉有点小题大做了。我开始的方法是dfs+dp,dp[i]表示i的子节点最大的魅力值,但是它给的是一 阅读全文
posted @ 2020-03-18 18:05 Target--fly 阅读(111) 评论(0) 推荐(0)

摘要:题目大意: 值得注意的一点是题目要求的是这些子段之间的最大整数和。注意和Max Sum Plus Plus 这个题目的区别。 题解: 线性区间DP,对每一段考虑取或者不取。定义状态dp[i][j]指的是前i个数分为j段。 如果第j段不选的话dp[i][j]=dp[i-1][j],直接就是上一个状态的 阅读全文
posted @ 2020-03-17 15:09 Target--fly 阅读(153) 评论(0) 推荐(0)

摘要:概率+0 1背包 要算成功的最大概率,那就是失败的最小概率,所以01背包直接让失败的概率最小就行了。 注意: 概率与概率之间是要相乘的,不是相加。 #include<bits/stdc++.h> using namespace std; const int N=1e4+7; int weight[N 阅读全文
posted @ 2020-03-16 12:19 Target--fly 阅读(114) 评论(0) 推荐(0)

摘要:题目大意:一天有h个小时,一个人喜欢睡觉,一共睡n次,每次都睡h个小时,开始时间为0,间隔a[i]或a[i]-1个小时开始睡第i次觉,每天都有一个最好时间区间,问这n次觉,最多有多少次是在最好时间内睡的。 题解:定义状态dp[i][j]为第i次觉是在j时刻睡的,那么状态转移方程dp[i][j]=ma 阅读全文
posted @ 2020-03-14 10:02 Target--fly 阅读(228) 评论(0) 推荐(0)

摘要:题目大意: 第一行一个n,表示共n个月份,然后第二行分别表示一个工人的聘请工资,月薪水,解雇工资。第三行是n个月每个月需要的工人的最少数目。然后求最少花费 题解: dp[i][j] 表示第i个月聘请j个人需要的最少花费。 状态是怎么转移的呢? 当第i-1个月聘请k个人时。 如果k<j。需要聘请新人 阅读全文
posted @ 2020-03-11 17:01 Target--fly 阅读(136) 评论(0) 推荐(0)

摘要:https://blog.csdn.net/someone_and_anyone/article/details/81044153 当串1 和 串2 的位置i和位置j匹配成功时, dp[i][j]=dp[i-1][j-1]+1,也就是说此状态由状态dp[i-1][j-1]转移而来,用数组记录为1, 阅读全文
posted @ 2020-03-10 18:02 Target--fly 阅读(224) 评论(0) 推荐(0)

摘要:题目大意: 两个字符串,可以再中间任何插入空格,然后让这两个串匹配,字符与字符之间的匹配有各自的分数,求最大分数 最长公共子序列模型。 dp[i][j]表示当考虑吧串1的第i个字符和串2的第j个字符时,当前的最大分数,当前有3中可能, 1,i与j直接匹配,那么这个状态是由dp[i-1][j-1]转移 阅读全文
posted @ 2020-03-10 16:40 Target--fly 阅读(174) 评论(0) 推荐(0)