动态规划
Txmiaomeow
这个作者很懒,什么都没留下…
展开
-
HDU 1422 重温世界杯(DP)
先马住,本质上是求子列的非负最大和。 #include <bits/stdc++.h> #define N 200000+10 using namespace std; int main() { int n; while(cin >> n) { int a,b,c[N]; for(int i = 1; i <= n ; i++) { sc...原创 2019-07-29 10:00:47 · 163 阅读 · 0 评论 -
HDU Robberies(小数背包)
很有意思的01背包问题。可能会把给出的概率上限当做背包容量,但第一背包容量为小数,存在精度问题,第二,如果将概率上限当背包容量,背包容量的变化并不是简单的减法。 于是采取将抢到的钱数作为背包容量的想法,dp[i]表示抢i块钱逃脱的最大概率。 #include <bits/stdc++.h> using namespace std; double dp[10010]; struct b{...原创 2019-09-28 10:20:31 · 649 阅读 · 0 评论 -
HDU 3732(01背包转多重背包)
这道题很有意思,N,C的数据量达到10000,如果用普通的01背包来做绝对会超时,注意到v和c只有0~10的范围,这说明有大量的v,c是重复的,相同的v,c的单词是等价的,这样就可以转化为多重背包来做。 不过普通的多重背包又可能会超时,于是我们采取二进制优化的方式来优化成01背包问题。 从01背包到多重背包又到01背包,的确是道好题。。 #include <bits/stdc++.h>...原创 2019-09-28 09:51:44 · 141 阅读 · 0 评论 -
HDU 3033 I love sneakers!(分组背包)
典型的分组背包问题,用dp[s][j]代表选到第s组,背包容量为j时的最大价值,注意每个品牌都要选,注意更新dp时考虑一下第s个有没有选。 #include <bits/stdc++.h> using namespace std; int dp[12][10010]; struct shoe { int no, p,v; }; typedef struct shoe S; S SHO...原创 2019-09-28 09:03:54 · 115 阅读 · 0 评论 -
HDU 2456 饭卡(01背包)
比较模板的题。。。但是有坑 我们求出m -5的预算下能达到的最大消费金额,然后再用剩下的钱去购买最贵的菜,这样得到的结果是最小的。。。 当m < 5 时 直接输出结果。。这也比较坑。。 #include <bits/stdc++.h> using namespace std; int dp[1010],p[1010],m,n; const int INF = 0x7f7f7f; ...原创 2019-09-25 19:35:49 · 153 阅读 · 0 评论 -
牛客假日团队赛16 J题 (矩阵连乘 DP)
题目描述得很清楚,就是一个矩阵连乘问题 不过由于自己学艺不精。。没有搞清楚原问题的p[0]存的是第一个矩阵的行数,一直按p[1]存的。。。 代码如下 #include <bits/stdc++.h> using namespace std; typedef long long ll; const int N = 100 + 10; int p[3 * N]; ll dp[3 * N][...原创 2019-09-23 15:10:17 · 158 阅读 · 0 评论 -
HDU 1160
最大上升子列问题。。先对w排序,然后就是求最大上升子列了。。 注意w和v都是严格的大小关系。。。 但是这道题麻烦的地方在于要输出路径。。。菜鸡不太会,于是借鉴了一下网上的代码。。。 下为代码。。。 #include <bits/stdc++.h> using namespace std; const int N = 1010; struct mouse { int w,v,no; }...原创 2019-09-18 22:17:23 · 148 阅读 · 0 评论 -
HDU 1176 免费馅饼(逆向DP)
动态规划题。。。。。由于终点很多,但起点只有一个 考虑采用逆向DP dp[i][j]表示第I秒第j个位置能拿到的最多的馅饼数,类比数塔,易推得状态转移方城,最终答案即为dp[0][5] #include <bits/stdc++.h> using namespace std; const int N = 100000 + 10; int dp[N][12],a[N][12];//aij...原创 2019-09-18 20:38:52 · 150 阅读 · 0 评论 -
HDU Humble numbers(动态规划)
本题是一到不是那么典型的DP题目,其状态转移为第i个数乘上2,3,5,7,后刚好大于dp[i-1]的数中的最小者。。 #include <bits/stdc++.h> using namespace std; typedef long long ll; ll dp[6000]; int main() { int two = 1,three = 1,five = 1,seven = 1...原创 2019-09-13 19:16:43 · 90 阅读 · 0 评论 -
HDU 1159 Common Subsequence
经典DP问题 话不多说上代码。。。 #include <bits/stdc++.h> using namespace std; string x,z; const int N = 1000+10; int dp[N][N]; int main() { while(cin >> x >> z) { if(x == "" or z == "" ) cout ...原创 2019-09-13 17:41:48 · 75 阅读 · 0 评论 -
HDU 1024 Maxsum+ (DP)
本题是前面MAXSUM的加强版,其实质是求一段数组的取出M个连续且互不相交的区间使得所有区间内的所有数相加之和最大。 状态表示:dp[i][j]表示分为i组 选取前j个数所得的最大和。 状态转移方程的推导有点意思,但想一想其实还是很简单; 如果分为i组:可以是已将前j - 1个数分为i组的情况下加上第j个数,也可以已将前j-1个数分为i - 1组后,第j个数单独成组。 但这样会超时,我们需要进行...原创 2019-08-16 21:23:25 · 73 阅读 · 0 评论 -
HDU 下沙的沙子有几粒?(递推)
写一下自己的思路历程。。 1.类比leetcode的括号匹配,采用dfs(当H的数目大于D的数目且D的数目小于n时,在字符串尾增加一个D)当H的数目小于m时,在子串增加一个H;结束搜索的条件是D的数目等于n且H的数目等于m,结束时检查得到字符串是不是符合要求,如果是则ans++;最后输出ans 结果是交上去血T; 由此想到第二种做法,由于n,m都不大,最多209个测试用例,因此想到可以打表来做 2...原创 2019-08-25 12:55:46 · 166 阅读 · 0 评论 -
HDU 2571 命运(DP)
简单dp,状态转移方程题上已给出。。。 但奇怪的一点是在找j的因子时,循环上限到了m?按理说j 应该就是前面的y*k,在y >=1时 k 应该<=j,而k >1,可能是个bug? 如果要保证j/k在迷宫内,应该有j/k>=1,j >=k #include <iostream> #include <stack> #include <cst...原创 2019-07-26 18:34:30 · 84 阅读 · 0 评论 -
HDU 2059 龟兔赛跑(DP)
状态转移方程为 dp[i]=min(dp[j]+time, Min) for j in range(0,i);表明最短时间是在某个充电站充完电后一口气冲到i的,内层j循环尝试寻找这样的j,外部i循环不断生成到充电站i的最短时间。 #include <cstdio> #include <iostream> #include <algorithm> using na...原创 2019-07-26 17:26:20 · 103 阅读 · 0 评论 -
牛客假日团队赛17 J题 守望者的逃离(动态规划 + 滚动数组优化)
看了好久才觉得是dp… 用dp[i][j]来代表第i秒剩余j能量能走的最大距离。但直接这么设开数组时会MLE,所以得进行空间优化。 另外本题要运用滚动数组法优化,但由于dp[i][j]和j的左右两边都有关系,所以我们不能直接省略掉一维,而是只保留最后两秒的状态,交上去直接就过了。。。 #include <bits/stdc++.h> using namespace std; int d...原创 2019-10-02 21:18:58 · 132 阅读 · 0 评论