
dp
99度灰
这个作者很懒,什么都没留下…
展开
-
HDU 5904 - LCIS
题目大意:求序列a与序列b的最大连续公共序列。解题思路:动态规划,a[temp]表示序列a以temp为末端的最长连续增大序列的长度。a[temp] = a[temp-1] + 1,这是由于输入序列a第一个数时,以这个数为末端的最长连续增大序列的长度肯定为1,之后序列a中的数,根据记录过temp-1的长度基础+1,如果没有记录过自然也是1,否则则是记录时的长度加1。这就是基于连续的规律。结果就根原创 2017-12-05 13:04:32 · 381 阅读 · 0 评论 -
HDU 1114 - Piggy-Bank
题目大意:存钱罐重t1克,加上钱币以后t2克。有m种硬币,输入每种硬币的价值以及硬币的重量,求存钱罐最少有多少钱。解题思路:完全背包,且要正好装满,初始化为无穷大,除了dp[0],dp大小为体积最大的情况。ac代码:#include #include #define INF 0x3f3f3f3fusing namespace std;int n, m, t1, t2,原创 2017-09-06 15:49:51 · 231 阅读 · 0 评论 -
HDU 2602 - Bone Collector
题目大意:n个骨头,背包体积V,n个骨头的价值以及体积。要求背包装最大价值为多少。解题思路:最基本的01背包问题。dp[i][j]表示,在前i件物品中,选择骨头,背包价值最大。对于每块骨头,如果小于总体积可以选择放或不放dp[i][j] = max(dp[i-1][j], dp[i-1][j-v[i-1]]+value[i-1]);否则dp[i][j] = dp[i-1][j];原创 2017-09-06 15:49:12 · 239 阅读 · 0 评论 -
POJ 3186 - Treats for the Cows
题目大意:有n头牛排着队,每天从头或为取一只牛出来卖,能卖出的价格为牛的价值乘上这是第几天,求把n头牛卖出最多能得到多少钱。解题思路:不能用贪心,因为当存在首尾价值一样的,会出问题。用dp看题解的。。。dp[i][j]表示从头取了i个,从尾取了j个时的最大价值。所以i+jac代码:#include #include using namespace std;int valu原创 2017-09-06 15:56:05 · 334 阅读 · 0 评论 -
POJ 1458 - Common Subsequence
题目大意:输入A,B字符串,A由a1,a2...an字符组成,B由b1,b2...bn字符组成。求最长公共子序列。解题思路:dp二维数组,dp[i][j]表示,a1,a2..ai与b1,b2...bj最长公共子序列。如果ai等于bj,dp[i][j] = dp[i-1][j-1] + 1;否则dp[i][j] = max(dp[i-1][j], dp[i][j-1]);ac代码原创 2017-09-06 15:47:26 · 263 阅读 · 0 评论 -
POJ 1088 - 滑雪
题目大意:中文题解题思路:dp+dfs。dp保存步数以及标记是否走过。每个位置要去四周找一个比自身大的位置,如果有,位置移动继续判断,如果没有返回的步数为其四周最大的步数多1。ac代码:#include #include #include using namespace std;int map[105][105], dp[105][105], R, C, Max;i原创 2017-09-06 15:36:58 · 248 阅读 · 0 评论 -
HDU 1160 - FatMouse‘s Speed
题目大意:要证明老鼠越胖,跑的越慢。求最长的证明证据。每一行输入老鼠体重,速度,以文件结束跳出。解题思路:将所有输入的老鼠,按输入顺序编号。然后按体重重优先与速度慢(体重轻优先与速度快)排序。然后用类似HDU1069长宽比较的方式,只是这里是,体重大于他之前,且速度慢与他之前,且只要算数量,但是要pre标记前一个编号为几。用于最后输出。ac代码:#include #inclu原创 2017-09-06 15:35:25 · 243 阅读 · 0 评论 -
POJ 2533 - Longest Ordered Subsequence
题目大意:求最长递增子序列的长度。解题思路:每个dp初始为1。第一个循环位置从0到n,判断,如果之后的有比该位置大的,就去判断后位置的dp大小。dp[j] = max(dp[j], dp[i]+1);ac代码:#include #include using namespace std;int dp[1005], n, a[1005], Max;int main(){原创 2017-09-06 15:34:25 · 241 阅读 · 0 评论 -
HDU 1069 - Monkey and Banana
题目大意:给出n个方块,每个方块的长宽高。每个方块有任意多块,叠的要求下一方块的长宽都比上一方块长。问最多能叠多高。解题思路:每个方块放在地面有三种方式,根据长宽的不同(长大于等于宽)。根据题最多叠的方式不过每个方块用三次,也就是每种方式用一次。对所有摆放方式的方块根据长、宽排序,这样每次能确保上面的长或宽较小,才有叠放的可能性。dp初始为每个方块的高。每个方块都判断其下面能放的高度。原创 2017-09-06 15:33:36 · 293 阅读 · 0 评论 -
HDU 1087 - Super Jumping! Jumping! Jumping!
题目大意:求最大递增子序列,可以跳着取。解题思路:dp,每个位置都去判断后面的点大于该位置的情况,重点dp初始化为输入的数。否则,5 3 2 3 0 1,过不了。输出所有dp就懂了。ac代码:#include #include using namespace std;int main(){ int n, a[1005], Max, dp[1005]; while (原创 2017-09-06 15:32:56 · 237 阅读 · 0 评论 -
HDU 2955 - Robberies
题目大意:小偷去银行偷钱,他有一个失败概率的最大值,告诉你每家银行可以偷多少,以及偷钱失败的概率。求小偷不被抓到,能偷到的最多的钱为多少。解题思路:看了很多题解。。。将所有银行的所有钱作为背包容量,偷银行不失败的概率作为价值(求的过程中的价值),求失败概率在他预估的最大失败概率内的最大背包容量。dp[i]表示,偷i钱逃跑的概率,所以dp[0] = 1。两个循环,第一个循环是第几个银行,第二原创 2017-09-06 15:29:00 · 229 阅读 · 0 评论 -
HDU 1260 - Tickets
题目大意:有n个样例,每个样例中有m个人去买票,如果每个人买一张,时间分别为a1,a2,a3...an秒,如果是二个人一起买票,则从第二个人起与前一个人一起买票,时间为b1,b2 ... bn-1秒。问,n个人买票最少需要多久。解题思路:dp公式,dp[i] = min(dp[i-1]+a[i], dp[i-1]+b[i])。dp[0]为一个人,是a1,dp[1]是两个人时,是min(a[原创 2017-09-06 15:28:10 · 264 阅读 · 0 评论 -
HDU 1003 - Max Sum
题目大意:给出n个数,求出其中连续子序列和最大的为多少,这个子序列的头位置以及尾位置。解题思路:很容易想到状态和状态转移的dp,dp[0]肯定等于输入的第一个数,后面的dp[i]根据前一个数是否大于0,如果大于0说明,此时可以加上前一个dp作为结果,否则直接用这个位置的数作为dp的值。后面去找就位置就简单了,要注意可能结果为负数的情况。ac代码:#include using原创 2017-09-06 15:26:53 · 250 阅读 · 0 评论 -
HDU 1257 - 最少拦截系统
题目大意:中文题。。。解题思路:贪心,dp。它拥有多套系统时,不一定要等一套系统用完再用第二套,而是可以同时准备着,第一套肯定需要面对第一枚导弹,所以第一套的最大高度就确定了,之后每一枚子弹来时都要选择那一套的高度最接近的系统,也就是高度最低,却高于等于导弹的系统来处理,如果都处理不了则新加一套导弹系统,这一套的最大高度为无法处理的高度。如果处理了就去改变选择的那一套系统的高度。a原创 2017-09-06 15:25:45 · 241 阅读 · 0 评论