
动态规划
圣帝天龙
菜!刷题啊!刷题不会,看题解啊!看题解看不懂,那就只能唱凉凉了
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
关于背包问题的思考
在0-1背包问题中的f数组初始化过程中,存在如下思考方式:(1)若要求背包必须放满,则初始如下: f[0] = 0 , f[1...V]表示-无穷。表示当容积为0时,只接受一个容积为0的物品入包。(2)若要求背包可以空下,则初始化如下: f[0...V] = 0 ,表示任意容积的背包都有一个有效解即为0。 具体解释如下: 1.初始...原创 2018-04-27 19:03:08 · 230 阅读 · 0 评论 -
SDNU1045(1048)石子合并(动态规划问题)
参考大佬博客:https://blog.youkuaiyun.com/sunshine_yg/article/details/47209299代码1045:#include<bits/stdc++.h>using namespace std;const int maxn=2e2+10;const int inf=0x3f3f3f3f;int dp[maxn][maxn];int...原创 2019-02-10 23:06:48 · 485 阅读 · 0 评论 -
POJ1088(动态规划+搜索)
题目链接:https://vjudge.net/contest/49759#problem/E//#include<bits/stdc++.h>#include<cstdio>#include<cstring>#include<iostream>using namespace std;const int maxn = 1e2+10...原创 2019-02-21 21:31:38 · 288 阅读 · 0 评论 -
SDNU1044花瓶插花(二维DP)
#include<bits/stdc++.h>using namespace std;const int maxn=1e3+10;int mapp[maxn][maxn];int dp[maxn][maxn];int n,m;int main(){ scanf("%d%d",&n,&m); memset(dp,0,sizeof(dp));...原创 2019-02-09 21:43:17 · 363 阅读 · 0 评论 -
SDNU1032机器人(二路DP+四维DP)
参考博客:https://blog.youkuaiyun.com/wychermit/article/details/47089639 #include<bits/stdc++.h>using namespace std;const int maxn=55;int n,m;int mapp[maxn][maxn];int dp[maxn][maxn][maxn][maxn];in...原创 2019-02-09 20:15:13 · 263 阅读 · 0 评论 -
POJ1159(最长公共子序列变形+滚动数组)
太菜了,参考大佬的博客知道了解题思路。 题意很简单,要求插入一定数目的字符使给定字符串成为回文字符串,问最小数目?这道题一个良好的解法是求给定字符串以及其逆串的最长公共子序列,用串长减去最长公共子序列就是结果。(不知道怎么证明的,但是一想貌似是对的)下一个重点是dp数组的存储,有两种方式,使用short int型数字和滚动数组,先附上short int 型代码#include<...原创 2018-09-03 21:37:01 · 509 阅读 · 0 评论 -
HDU2546(转化为0-1背包问题)
1.做题首先注意审题: 卡上的剩余金额大于或等于5元,就一定可以购买成功(即使购买后卡上余额为负),否则无法购买(即使金额足够)。这句话非常重要!2.本题棵可以用贪心思想考虑最后一步:当余额>=5时,一定可以购买成功,余额<5无法购买。最后一次应该争取在离5元最近的地方购买最贵的东西。翻译这句话即:求解容量为m-5(余额的最大容量)的0-1背包的最大花销。而且要将最贵的产品放在...原创 2018-08-30 09:35:13 · 255 阅读 · 0 评论 -
HDU1159(最长公共子序列+动态规划)
最长公共子序列问题:(LCS)1.string类的函数length()返回对象中字符的个数2.假设string str;那么str中第i个字符应该是str[i-1]#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<...原创 2018-08-28 20:19:57 · 287 阅读 · 0 评论 -
HDU1619(动态规划记录路径)
思路:利用动态规划的思想将输入矩阵的dp矩阵记录下来,用结构体来存储dp矩阵,并且将每个元素的前驱结点记录下来。将所有最小权值路径记录下来,从尾节点到头结点进行回溯,用stk数组记录路径下标,倒序输出。#include<iostream>#include<cstdio>#include<cstring>#include<algorithm...原创 2018-08-28 11:48:58 · 966 阅读 · 0 评论 -
HDU1003
这道题目要求输出输出一段给定序列的最大连续子序列,数据范围-1000到1000。我们用dp的思想来划分阶段,考虑前i个数字的最大连续子序列,我们将num[i]作为必选数字(由题意可知,最大连续子序列最小长度是1,即必须有一个必选数字)。1.在num[i]作为必选数字的前提下,我们考虑前i个数字的局部最优解。2.num[i]作为必选数字的局部最优解是由num[i-1]作为必选数字的局部最...原创 2018-08-27 21:49:28 · 524 阅读 · 0 评论 -
POJ1163数字三角形(动态规划)
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn=105;int mapp[maxn][maxn];int dp[maxn][maxn];int n;int main()...原创 2018-08-27 13:27:23 · 237 阅读 · 0 评论 -
动态规划学习(一):基本求解步骤
动态规划所处理的问题是一个多阶段决策问题,一般由初始状态开始,通过对中间阶段决策的选择,达到结束状态。这些决策形成了一个决策序列,同时确定了完成整个过程的一条活动路线(通常是求最优的活动路线)。 1.动态规划算法基本求解步骤: (1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。...原创 2018-08-17 14:54:24 · 28226 阅读 · 0 评论 -
UVALive7672
这道题目如果每一次都广搜一次会超时。先打表就可以了。思路是定义数组step[maxn][5][5];数组元素step[n][i][j]表示在i步增加操作和j步双倍操作后对于"12345"转换到数字n的最小步数,打表形成可能的所有数字变换的情况。经验:利用打表的思想可以大大减少时间复杂度。#include<iostream>#include<cstdio>#in...原创 2018-08-19 21:28:05 · 295 阅读 · 0 评论 -
sdnu采药2(完全背包问题)
第一种思路:将能放进背包的第i种物品看做一件物品,转化为0-1背包问题: #include<iostream>#include<algorithm>#include<cstring>using namespace std;const int NN=1000;const int TT=1000;int v[NN+1];int t[NN+1];...原创 2018-08-07 20:57:56 · 274 阅读 · 0 评论 -
(CodeForces - 1017C)LDS+LIS之和最小
限定:1.给定数字n2.数组里的数字只能是从1-n中选择3.要求数字序列的最长上升(递增)子序列和最长递减(下降)子序列最短结论,当分块数为sqrt(n)的时候最小,分块方法:各个块的内部递增,块的整体递减比如:对于从1-9这些数字进行分块,789456123的LDS+LIS最小:3+3=6#include<iostream>#include<algori...原创 2018-08-11 20:49:27 · 402 阅读 · 0 评论 -
SDNU1033采药1
在考虑状态转移方程的时候,应当考虑当前状态的全部情况,以及与之对应的状态转移的下一步情况,才能保证考虑的完整.简单的0-1背包问题: #include<iostream>#include<cstring>using namespace std;const int maxn=105;int T,m;//t表示总时间,m表示草药总数int w[maxn];...原创 2018-08-07 00:20:46 · 193 阅读 · 0 评论 -
sdnu1040.拦截导弹
#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int dp[21];int h[21];int i,k,ans;//ans是记录导弹是否全部被拦截的标记int work(){ for(i=...原创 2018-05-23 15:36:49 · 324 阅读 · 0 评论 -
HDU1231最大连续子序列的和
#include<bits/stdc++.h>using namespace std;const int maxn = 1e4+10;int a[maxn];int n;void solve(){ int maxs = a[0],cnt = 0,l = a[0],r = a[0],t; /**maxs记录最大连续子序列之和**/ /**cnt记...原创 2019-02-22 17:10:22 · 209 阅读 · 0 评论