ACM_动态规划
文章平均质量分 69
Ch_zaqdt
这个作者很懒,什么都没留下…
展开
-
HDU 2602 Bone Collector(01背包模板题)
一道01背包的裸题,不带拐弯的裸题...看代码吧AC代码:#include <iostream>#include <cstring>using namespace std;const int MAXN = 1005; //数组不要开太小,不然会WAint dp[MAXN];int val[MAXN]; //存价值int v[...原创 2018-02-08 21:07:29 · 199 阅读 · 0 评论 -
HDU 3746 Cyclic Nacklace(kmp循环节)
题意是给你一个字符串,看它是不是一个由子串循环组成的字符串,比如ababab就是由ab循环组成的,然后让求的是如果这个字符串不是一个循环的字符串就问需要加多少个字符才能变成一个循环的字符串,是的话就为0。 用kmp求出字符串前后缀重复数Next[],则尾部不能循环的部分长度为L=n-next[n-1],需要补充的长度为L - n%L 根据这道题,可以延伸去判断...原创 2018-04-23 17:29:48 · 165 阅读 · 0 评论 -
牛客小白月赛3 B.躲藏(动态规划)
题目链接:https://www.nowcoder.com/acm/contest/87/B 第一眼看以为是kmp,然后仔细一看是子序列,再看数据范围,暴力的话肯定会超时,所以这道题需要用动态规划来写,令 f[i][j],(j = 1,2,3,4) 表示前 i 个字符中,匹配了字符串”cwbc” 的前多少位,那么有转移方程: f[i][1] = (f[i−...原创 2018-05-14 15:37:14 · 389 阅读 · 0 评论 -
北京信息科技大学第十届程序设计竞赛 H.程序员的好印象(动态规划)
题目链接:https://www.nowcoder.com/acm/contest/118/H读懂题意就很好写了,就是求最长单调不减子序列。把LIS改个符号就行了,不会的可以看下这篇博客传送门,有二分优化写法。AC代码:#include <iostream>#include <cstdio>#include <cstring>#define Max(a,b...原创 2018-05-14 16:01:08 · 270 阅读 · 0 评论 -
第十四届华中科技大学程序设计竞赛决赛 F.Beautiful Land(01背包变形)
题目链接:https://www.nowcoder.com/acm/contest/119/F 题意是有T组数据,然后输入n,m,表示有n种树,最大容量是m,然后n行输入每种树的花费和价值,问能得到的最大价值,看一眼数据范围就知道不是简单的裸的01背包了,这种题之前也见过好多次,需要把最小容量最大价值的问题转换成按照价值去求最小花费。AC代码:#include <io...原创 2018-05-14 20:27:27 · 180 阅读 · 0 评论 -
POJ 1088 滑雪(记忆化搜索)
题目链接:http://poj.org/problem?id=1088 如果我们一个一个点去搜的话,肯定会超时,因为有些点会被重复搜索,这样就很浪费时间,所以我们需要用dp来标记一下,因此dp就用来标记当前点的最长距离,如果搜索到的点的dp已经有值了,那么就返回这个dp值直接用就好了(避免重复搜索),因为可以往四个方向去搜,所以用sum来求四个方向的最远距离然后赋值给dp。...原创 2018-07-19 10:37:12 · 152 阅读 · 0 评论 -
HDU 1078 FatMouse and Cheese(记忆化搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1078 题意是给了两个数n和k,表示有n*n的地图,地图的每个点都有一个权值,有一只老鼠从0,0开始吃奶酪,它可以走上下左右四个方向,一次可以移动1到k个单位,而且每次移动的权值都要比上一次的权值大,最后输出一个最大值。 算是记忆化搜索的入门题了吧,和poj那道滑雪...原创 2018-07-19 10:46:31 · 147 阅读 · 2 评论 -
HDU 1331 Function Run Fun(记忆化搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1331 题意是输入三个数,然后按题目中的条件输出这三个数的值。 因为情况会有很多种,所以也会有重复出现的状态,所以需要用dp数组来标记一下。AC代码:#include <iostream>#include <cstdio>#in...原创 2018-07-19 10:50:41 · 269 阅读 · 0 评论 -
HDU 1978 How many ways(记忆化搜索)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1978记忆化搜索裸题AC代码:#include <iostream>#include <cstdio>#include <cstring>#define maxn 105#define mod 10000using namespace s...原创 2018-07-19 15:46:49 · 178 阅读 · 0 评论 -
HDU 6447 YJJ's Salesman(离散化+树状数组+dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6447 题意是有一个1e9*1e9的地图,有1e5个村庄,有一个人从(0,0)开始往(1e9,1e9)走,他每次只能向右、向下、向右下走一个单位,当他从一个地方向右下走到一个村庄时(从(x,y)走到(x+1,y+1)的时候),他就可以获得这个村庄的权值,问他能获得的最大权值是多少。...原创 2018-08-31 01:02:55 · 302 阅读 · 0 评论 -
HDU 3339 In Action(dijkstra+01背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3339 题意是有n个点m条边(点的编号是1-n),起点为0,每个点都有一个权值k,每条边也都有一个权值d(点到点的距离),现在起点有一个坦克要去摧毁任意个点,使得这些被摧毁的点的权值之和要大于总和的一半,问坦克最少要走多少才能使得被摧毁的点的权值之和能大于点权总和的一半。 ...原创 2018-10-17 17:24:40 · 149 阅读 · 0 评论 -
湖南大学第十四届ACM程序设计新生杯 F. Find the AFei Numbers(数位dp)
题目链接:https://ac.nowcoder.com/acm/contest/338/F 题意就是从1-n中找出有多少个包含520的个数。 裸的数位dp,找出不包含520的个数,然后减一下就好了。AC代码:#include <bits/stdc++.h>#define ll long longusing namespace std...原创 2019-01-17 18:11:37 · 223 阅读 · 0 评论 -
HDU 2089 不要62(数位dp)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 数位dp模板....AC代码:#include <bits/stdc++.h>using namespace std;int a[10];int dp[10][10];int dfs(int pos, int pre, bool limit)...原创 2019-01-17 18:26:38 · 184 阅读 · 0 评论 -
Codeforces Beta Round #51 D. Beautiful numbers(数位dp+思维)
题目链接:http://codeforces.com/contest/55/problem/D 题意就是给你一个范围,问这个范围内有多少个数是它各位非零数的倍数。 思路就是数位dp,但是要求这个数要能整除各个非零位,这个状态不太好标记,所以这里就需要用一点数学知识了,一个数可以整出这个数的每一位非零数,那么只要可以整出每一位非零数的lcm就好了,然后我们可以算...原创 2019-01-17 21:30:11 · 134 阅读 · 0 评论 -
HDU 3555 Bomb(数位dp入门)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 题意是输入一个n,求出1-n中有多少个数不包含49。 裸的数位dp。AC代码:#include <bits/stdc++.h>#define ll long longusing namespace std;int a[20];l...原创 2019-01-17 22:16:22 · 126 阅读 · 0 评论 -
POJ 3252 Round Numbers(数位dp+前导零)
题目链接:http://poj.org/problem?id=3252 题意是找出l到r范围中的二进制中0的个数大于等于1的有多少个。 思路就是我们将它的二进制存起来,然后这里需要判断前导零的情况,不是很难理解,以dp[pos][n0][n1]分别来存第pos位,0的个数,1的个数,然后记忆化搜索就好了。AC代码:#include <iostr...原创 2019-01-17 23:23:12 · 192 阅读 · 0 评论 -
牛客寒假算法基础集训营3 G. 处女座和小姐姐(三)(数位dp)
题目链接:https://ac.nowcoder.com/acm/contest/329/G 数位dp的模板题,注意需要开ll,先求出来区间内不包含6的个数,然后再用区间长度减一下就是包含6的个数了。AC代码:#include <bits/stdc++.h>#define ll long longusing namespace std;int a[...原创 2020-02-14 20:08:28 · 345 阅读 · 0 评论 -
牛客寒假算法基础集训营1 C. 小a与星际探索(dp或者各种姿势)
题目链接:https://ac.nowcoder.com/acm/contest/317/C 这道题本质上是一道dp题,但是dijkstra或者搜索都可以过,没什么说的,只贴dp和搜索的呆码吧,dij写的太丑了,而且也不知道为什么姿势不对就会内存超限。AC代码(dp):#include <bits/stdc++.h>#define maxn 4005...原创 2020-02-14 20:05:41 · 499 阅读 · 7 评论 -
UVa 624 CD(01背包)
题目链接:传送门 做这道题的时候不知道怎么输出路径,然后我就很麻烦的先用01背包把能装下的最大值求出来,然后用这个最大值去用递归输出路线,很麻烦,然后看了别人的代码,发现可以在更新dp[j]的值的时候记录下当前的dp[i][j]。先上之前的我写的递归输出路径的代码:AC代码:#include <iostream>#include <cstdio>#inclu...原创 2018-04-06 16:51:50 · 366 阅读 · 0 评论 -
整数划分总结
博客原地址:https://blog.csdn.net/dacc123/article/details/50664738整数划分问题:笼统上说就是将一个整数划分成若干个整数之和的方案数。整数划分有很多不同的问法,也有比较隐晦的问法。比如n个苹果放到m个盘子里,比如n个砖块堆成m个层阶梯。关于整数划分,大概有以下这么多扩展的问题:1、整数n划分成若干整数之和的方案数;2、整数n划分成k个整数之和的方...转载 2018-03-28 15:23:25 · 4986 阅读 · 1 评论 -
POJ 3624 Charm Bracelet(01背包模板题)
又是一道01背包裸题。AC代码:#include <iostream>#include <cstring>#include <cstdio>#define MAX(a,b) a>b?a:busing namespace std;const int MAXN = 1000005;int dp[MAXN];int w[MAXN];...原创 2018-02-08 21:11:03 · 196 阅读 · 0 评论 -
HDU 2955 Robberies(01背包+思维)
这是一道关于小数的01背包问题,题意代码注释中有,如果按着题的思路来写,会发现那个概率是小数,在转移方程里没法实现,所以我们需要换个方向思考了。我们可以按成功逃跑的概率来算,每个w数组里存成功逃跑的概率,然后让总价值作为背包容量,然后在dp中用价值去存逃跑的概率,最后从价值最大(背包容量)到小遍历(因为价值越大逃跑成功率越低),直到第一次出现逃跑成功的概率小于等于题目给的逃跑成功概率...原创 2018-02-08 21:53:06 · 393 阅读 · 0 评论 -
HDU 1171 Big Event in HDU(01背包)
题意在代码注释中有,思路就是先记录所有价值的总和sum,既然要求两个学院分得的器材价值尽量接近,那么取总和的一半ans,让其中一个学院尽量接近ans,那么另一个学院也会尽量接近ans,所以就两个学院尽量相同了。还有就是器材可能不唯一,所以需要再加一个for循环把这个器材用完。AC代码:#include <iostream>#include <cstring>...原创 2018-02-08 22:07:11 · 209 阅读 · 0 评论 -
HDU 2546 饭卡(01背包+预处理)
这是一道01背包问题,但是需要预处理一下,因为当你的钱不够5块钱的时候,你什么都买不了,所以直接输出钱数,当你的钱大于5块钱的时候,你可以先拿出来5块钱,留着最后去买最贵的菜,现在你剩下m-5块钱,排个序把最贵的留在最后,然后就用01背包把这m-5尽量装满(遍历1~n-1种菜,因为n是最贵的菜要留给最后),然后再用那剩下的5块钱去买最贵的菜,最后就是最优解m-dp[m-5]-dp[n...原创 2018-02-08 22:21:08 · 197 阅读 · 0 评论 -
NYOJ 860 又见01背包(思维)
刚一看这道题以为是01背包的裸题,TLE了一次后发现这是一道拐了个弯的裸题,题中给的物品重量范围太大了,所以我们可以换种思路,把最大价值求出来,然后在dp中用价值去存重量,然后价值从大到小遍历找出第一个不大于题中给的重量,然后输出价值即可。AC代码:#include <iostream>#include <cstring>using namespace s...原创 2018-02-08 22:31:18 · 261 阅读 · 0 评论 -
HDU 1114 Piggy-Bank(完全背包+恰好装满)
就以这道题来简单讲解一下完全背包问题,首先完全背包和01背包的区别在于01背包每样物品只有一个,用完了就不能再用了,而完全背包的物品是有无限个的,所以完全背包又衍生出能不能把背包恰好装满的问题。能否恰好装满问题对dp数组初始化的时候做点改变就行了。 下面是完全背包的核心代码: for(int i=0;i<p;i++){ for(int j=w[i...原创 2018-02-10 16:56:27 · 1008 阅读 · 0 评论 -
NYOJ 311 完全背包(恰好装满)
就直接上代码吧,至于判断恰好装满问题可以看下这篇博客传送门(Piggy-Bank)需要注意的是直接调用max函数会TLE,所以以后还是不要懒省事的直接调用max函数吧。AC代码:#include <iostream>#include <cstring>#include <cstdio>#define MAX(a,b) a>b?a:busing na...原创 2018-02-10 18:52:21 · 756 阅读 · 0 评论 -
HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包裸题)
一道多重背包的裸题,想看详解的可以看这篇博客传送门(Coins)AC代码:#include <iostream>#include <cstring>#define MAX(a,b) a>b?a:b#define MAXN 100000#define INF 0x3f3f3f3fusing namespace std;int dp[M...原创 2018-02-10 19:55:06 · 214 阅读 · 0 评论 -
POJ 2603 HDU 1963 Investment(完全背包)
这有一篇完全背包的详解,也加了判断是否恰好装满的状态传送门(Piggy-Bank) 题意在代码注释中有,算是完全背包的模板题吧,但是需要注意一点,因为题目中说了所有数据都是1000的倍数,所以我们可以对数据都进行缩小1000倍来进行计算。AC代码:#include <iostream>#include <cstring>#include &l...原创 2018-02-10 18:47:52 · 292 阅读 · 0 评论 -
HDU 2844 Coins (多重背包+二进制优化)
首先这是一道多重背包的裸题,题意在代码中的注释里有。多重背包就是所给的物品是有限的(任意个),我们则可以把多重背包的问题转换成01背包和完全背包来求解。首先我们先把01背包和多重背包的过程封装成函数,需要用的时候传参过去就好了,然后我来解释一下什么时候用01背包,什么时候用完全背包。我们先不考虑价值,假如说A的重量是3,有10个,B的重量是5,有2个,而你的背包的最大重量为15。对于...原创 2018-02-10 19:08:32 · 519 阅读 · 0 评论 -
Hiho Coder 1038 01背包(模板)
01背包的原型就是有N件物品和一个容量为V的背包。放入第i件物品耗费的空间是Ci,得到的价值是Wi,求将哪些物品装入背包可使获得的价值总和最大。而这道题的题意也就是这个意思,01背包的特点就是每种物品仅有一件,可以选择放或者不放。下面是01背包的核心代码:for(int i = 0; i < n; i++){ for(int j = V; j >= c[i]; j--...原创 2018-02-06 23:49:13 · 317 阅读 · 0 评论 -
NYOJ 18 The Triangle
动态规划问题,题意是输入一个数字三角形,然后从上往下走一条路,问走到底端的最大值。如果从上往下走的话会有很多种情况,所以不如反过来从下往上递推,比较大小求最大值。AC代码:#include <iostream>#include <cstdio>#define MAX(a,b) (((a)>(b))?(a):(b))using namespace s...原创 2018-03-06 11:00:03 · 199 阅读 · 0 评论 -
Manacher(马拉车)算法详解
马拉车用于解决最长回文子串问题,重点是子串,而不是子序列,想了解最长回文子序列的可以看下这篇博客传送门。对于这种问题,当然最简单粗暴的方法就是暴力求解,但太暴力也不好,毕竟会TLE。所以对于求最长回文子串的问题有一种神奇的算法——马拉车算法,神奇就神奇在时间复杂度为O(n)。 我先说一下大概思路,就是用一个Len[i]数组去存第i个位置到mx位置的长度,然后用i...原创 2018-03-29 20:06:25 · 2850 阅读 · 4 评论 -
最长公共子序列和最长公共子串
首先说一下最长公共子序列和最长公共子串的区别就是前者可以不连续,后者一定是连续的,比如abcde和abced,他的最长公共子序列是abcd或者abce(长度为4),而他们的最长公共子串只abc(长度为3)。 这两个虽然是两个名字,但这都是LCS(Longest Common Subsequence)问题,是很经典的动态规划问题,以NYOJ的一道题为例:传送门。 ...原创 2018-03-26 12:48:36 · 357 阅读 · 0 评论 -
psd面试(lps或lcs)
题目链接: https://www.nowcoder.com/acm/contest/90/D 题解有两种方法,一种是用另一个字符串把原字符串复制下来并反转,然后对这两个字符串进行LCS,第二种是直接dp。这里我用的是第一种方法。 LPS博客:https://blog.csdn.net/charles_zaqdt/article/details/7971421...原创 2018-03-26 16:12:10 · 446 阅读 · 0 评论 -
最长回文子序列
和lcs差不多,也可以用递归来写,但是会重复处理很多次,所以还是考虑用动态规划来写。它的动态转移方程为 当str[i]==str[j]时,i->j的最长回文子序列就等于,在 i->j 之间上一个最长回文子序列的基础上+2当str[i]!=str[j]时,i->j的最长回文子序列就等于在i+1->j 和 i->j-1中...原创 2018-03-27 15:56:43 · 2118 阅读 · 3 评论 -
最长单调递增子序列
LIS(Longest Increasing Subsequence)问题也是一个经典的动态规划问题,最简单粗暴的方法就是暴力去枚举了,然后就是用动态规划的方法,首先我们要用dp数组去存每一个数前的最长单调递增序列,先初始化dp[]为1,我们要先遍历一遍数组,然后再用一个for循环遍历i之前的数,如果有pre[j]<pre[i],则有dp[i] = max(dp[i],dp[j...原创 2018-03-27 16:37:38 · 690 阅读 · 0 评论 -
Educational Codeforces Round 63 (Rated for Div. 2) D. Beautiful Array(dp)
题目链接:https://codeforces.com/contest/1155/problem/D 题意是给了n个数,可以选择一个子区间,使得这个区间内的每一个数乘x,然后求一个和最大的子区间的值。 思路就是dp,对于一个区间有三种情况: 1. 选择这个数 2. 选择这个数乘x 3. 选择这个...原创 2019-04-24 16:56:36 · 202 阅读 · 0 评论