动态规划
文章平均质量分 79
~VEGETABLEBIRD~
这个作者很懒,什么都没留下…
展开
-
洛谷——P1026 统计单词个数
原题链接这道题的难度实际上并不是很大,只要将其拆分成两个子问题,很容易就找到问题的解法。从题意来看,很容易知道这是一个动态规划,也很容易想到动态规划的状态是用dp[i][j]表示前i个字母分成j份所包含的最大单词数。那么很容易得到状态转移方程:dp[i][j]=max(dp[r][j-1]+word_dp[r+1][i],dp[i][j]),word_dp[i][j]表示从i到j的单词数。翻译一下状态转移方程的意思就是:前i个字母分成j份的最大单词数=max(前i个字母分成j份的最大单词数,前r个单词分原创 2020-10-11 16:18:02 · 371 阅读 · 0 评论 -
洛谷——P1004 方格取数
原题链接一道四维动态规划的模板题。不妨令两个人同时从起点走到终点,很容易知道,dp[i][j][m][k]表示第一个人走到(i,j)位置、第二个人走到(m,k)位置时取数的最大值。易得状态转移方程为dp[i][j][m][k] = max(max(dp[i][j - 1][m][k - 1], dp[i - 1][j][m - 1][k]), max(dp[i - 1][j][m][k - 1], dp[i][j - 1][m - 1][k])) + map[i][j] + map[m][k]。当然要考虑原创 2020-09-17 23:07:01 · 164 阅读 · 0 评论 -
洛谷——P1048 采药
原题链接这是一道非常基础的01背包问题,背包容量就是时间,物品价值就是草药价值。我们先来看二维的背包。状态很容易写出来,dp[i][j]就是前i种草药j时间内所能采到的最大价值。动态转移方程也就很容易写出,dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]],v[i]储存的是第i种草药的时间。第二种情况需要j>=v[i]。代码如下(时间和体积数组直接用对组储存):#include<iostream>#include<cmath>#includ原创 2020-08-09 10:23:31 · 288 阅读 · 0 评论 -
洛谷——P1028 数的计算
这道题的标签既然是递归,我们不妨就从递归这个方向考虑。那么,我们就要找出递归关系式。仔细考虑一下,不难想到,这道题实际上是与奇偶性有关的。对于2k,2k+1,2k+2这三个数,我们仔细研究一下。显然,2k+1、2k组合出来具有这个性质的数的个数相等。为什么呢?我们看,(2k+1)/2=k,2k/2=k,那么就说明2k+1和2k的前一位是由0~k之间的数组成的,那么这两个数组合出来具有这个性质的...原创 2020-02-20 21:24:10 · 238 阅读 · 0 评论 -
洛谷——P1002 过河卒
原题链接一道比较基础的动态规划的题目,这里细致的讲解一下如何得到状态转移方程以及如何对空间进行压缩。首先,不难想到,用一个二维数组dp表示状态,那么dp[i][j]就可以表示到达第i行第j列所有的方案总数。因为棋子到达(i,j)位置的方式只有两种,一种是从(i-1,j)向下移动一格,一种是从(i,j-1)向右移动一格。所以,到达(i,j)的方案总数就是(i-1,j)和(i,j-1)的方案数相加。即状态转移方程:dp[i][j]=dp[i-1][j]]+dp[i][j-1]但是要注意,如果马无法到达(原创 2020-08-04 17:43:47 · 508 阅读 · 1 评论 -
P1255——数楼梯
思路:高精+动态规划+滚动数组高精不必再提,f[i]表示第i层楼梯走法,那么状态转移方程为f[i]=f[i-1]+f[i-2],也就是斐波那契数列。当然,不同的是f[n]=n(n<=2)代码:#include<iostream>using namespace std;const int MAXN = 2001;int last[MAXN] = { 1,1 }, now...原创 2020-04-27 19:27:04 · 500 阅读 · 0 评论 -
洛谷——P1018 乘积最大
原题链接这道题其实动态规划并不难,只是高精有点复杂,我用py 。先说下思路,dp[i][j]表示的是前j个数放入i个乘号的最大值,不是前i个数放入j个乘号的最大值。所以就有动态转移方程dp[i][j]=max(dp[i][j],dp[i-1][k]*a[k+1][j])a[k+1][j]表示的是第k+1位到第j位组成的数。这里我用pyhton实现n, k = map(int, input(...原创 2020-04-13 14:59:02 · 182 阅读 · 0 评论 -
洛谷——P1040 加分二叉树
原题连接这个题实际上并不是很难,关键有两点。其一是利用动态规划求解出最高加分,其二就是将树的前序遍历输出。动态规划其实非常的简单,dp[i][j]表示的是i到j的区间内的最大加分。那么显然就有动态转移方程dp[i][j] = max(dp[i][j], dp[i][k-1] * dp[k+1][j]+dp[k][k])。而对于求前序遍历,只需要利用一个root[i][j]记录一下i到j区间...原创 2020-04-08 18:58:12 · 138 阅读 · 0 评论 -
洛谷——P1021 邮票面值设计
这个题的大致思路是用搜索找出所有可能的邮票面值种数,在进行动态规划。动态规划很简单,dp[i]表示的是组成价值为i的最小邮票数,那么很简单的就可以得到动态转移方程:dp[i]=min(dp[i],dp[i-a[j]]+1),a[j]是对邮票的面值进行枚举。那么,显然难点在于搜索上了。我最开始的想法是,先把K种面值搜索出来。首先,1肯定是要的。但是搜索的上界并不容易确定。一个明显的一点是,最后一...原创 2020-04-07 16:57:39 · 292 阅读 · 0 评论 -
洛谷——P1077 摆花
一道简单的dp问题。dp[i][j]表示前i种花j个花盆的方案数。那么就有状态转移方程为sum(dp[i-1][k]),其中k的取值是从0到min(j, a[i])。#include<iostream>using namespace std;int m, n;int dp[105][105];int a[105];int mod = 1000007;int min(in...原创 2020-04-04 08:59:49 · 239 阅读 · 0 评论 -
洛谷——P4817 [USACO15DEC]Fruit Feast G
非常简单的一个水题。对于橙子和柠檬所能构成的饱和度的所有情况,可以用ax+by表示。看似要进行复杂度为O(n^2)的枚举,实际上,我们以先枚举x,再枚举y,将其复杂度降至O(n)。#include<iostream>using namespace std;bool f[5000100]={1};//判断饱食度i是否可以达到int a,b,t;int main(){ ...原创 2020-04-02 16:31:21 · 328 阅读 · 0 评论 -
洛谷——P1679 神奇的四次方数
一道很简单的dp水题状态是dp[i]表示第i个数最小n,状态转移方程就是dp[i]=min(dp[i],dp[i-j]+1)其中j是可以开四次方的数#include<iostream>#include<cmath>using namespace std;int dp[100000],n;int main(){ cin>>n; dp[...原创 2020-03-25 23:10:10 · 448 阅读 · 0 评论 -
洛谷——题解 P1564 【膜拜】
先分析题目,是个很明显的DP问题。很容易我们就可以想到dp[i]表示对于前i个人的最少分配的机房数。下面我们开始找动态转移方程。再仔细读一遍题,老师只会把连续一段的同学分进一个机房。这样就简单了。因为老师只会把连续一段的同学分进一个机房,那么对于第i位同学,我们就可以查验第j位同学,是否能够使得j~i都是同一位神牛的膜拜者,或者两个神牛的膜拜者人数差不超过m。如果j满足条件,此时分配的机房数就相...原创 2020-03-23 19:05:42 · 314 阅读 · 0 评论 -
洛谷——P2028 龙兄摘苹果
一道比较简单的DP水题。我们用dp[i][j]表示用i个不同的苹果填充j个篮子的方案总数。那么状态转移方程也就出来了。dp[i][j]=dp[i-1][j-1]+j*dp[i-1][j]。这里的dp[i-1][j-1]表示的是i-1个苹果放入j-1个篮子,第i个苹果放入第j个篮子,而dp[i-1][j]表示i-1个苹果放入j个篮子,第i个苹果随机放置。代码如下:#include<io...原创 2020-03-23 08:50:39 · 241 阅读 · 0 评论 -
洛谷——P2049 魔术棋子
一个比较简单dp问题。我们先来分析一下题目,要找到所有的模的总数,首先可以想到,用dp[i][j]表示在(i,j)这个点所有的方案数。但是,这样显然不行。因为仅仅知道方案总数对求解下一个状态毫无帮助。那么,我们就要记录每一个点所有可能的模。所以,我们用三维dp[i][j][l]表示在(i,j)点是否能够得到模l。即有状态转移方程:dp[i][j][l * num[i][j] % k]=dp[i...原创 2020-03-22 09:51:26 · 228 阅读 · 0 评论 -
洛谷P1387——最大正方形
简单的DP水题…我们先理解题目,如果想要以(i,j)点为右下角构成正方形,那么第一个要满足的条件是在这个点数值为一。如果想要连通其他点,那么左斜上三点必定可以构成正方形。这样,有动态转移方程dp[i][j]=min(dp[i][j-1],dp[i-1][j],dp[i-1]dp[j-1])+1(dp[i][j]==1)代码如下:#include<iostream>using n...原创 2020-03-20 12:44:55 · 279 阅读 · 0 评论 -
洛谷——P1044 栈
第一种方法就是搜索,必然超时…#include<iostream>#include<cstring>using namespace std;long long ans = 0;int n;void DFS(int in, int rout) { if (rout == 0) { ans++; return; } if (in == 0) DFS...原创 2020-03-10 15:24:53 · 165 阅读 · 0 评论 -
洛谷——P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles
动态规划:原题链接这道题的动态转移方程是a[i][j]+=max(a[i-1][j],a[i-1][j-1])当然,要注意边界问题#include<iostream>using namespace std;int max(int a, int b) { return a > b ? a : b;}int main(){ int n; ci...原创 2020-03-09 09:08:23 · 184 阅读 · 0 评论 -
洛谷P1049——装箱问题
**从搜索到动态规划(逐步理解)**原题链接1.搜索我们先仔细理解这道题,让剩余空间最小,实际上就是让让放入的体积最大。而对于每一个物体,我们都有放入和不放入两种选择。所以下一层搜索要搜索两个。讲解放入代码中更明白一些。#include<iostream>using namespace std;const int MAX = 20005;int wei[MAX];//储存...原创 2020-02-29 16:20:42 · 367 阅读 · 0 评论