DP
文章平均质量分 52
二分查找
这个作者很懒,什么都没留下…
展开
-
hdu5396(区间DP)
题意:给出n个数字,和n-1个操作符('+', '-', '*');然后每次选一个操作符,算完把结果放进去,直到只有一个数字;For example, a possible sequence of operations for "1+4∗6−8∗3" is 1+4∗6−8∗3→1+4∗(−2)∗3→1+(−8)∗3→(−7)∗3→−21. 问所有的选择方法得原创 2015-08-19 10:55:50 · 378 阅读 · 0 评论 -
uva10673(数论)
题目的意思就是给出两个数字x , k肯定存在两个数字p,q 使一个是向下取整,一个是向上取整.求一组p,q;如果这个数整出,那么向上向下取整肯定是一样的,而且是x的k分之一,那么只要p+q==k就行,我是直接输出0和k如果两个数不整除,那么两个数肯定差1.那么小的那个系数去-x 大的取x相加肯定等于x所以输出-x 和 x;AC代码:#incl原创 2014-12-27 13:04:24 · 392 阅读 · 0 评论 -
uva10604(DP +回溯)
题目的意思就是有几种化学药剂;两种药剂反应会放出热量,并且生成一种药剂;给出有几种药剂m.然后是按顺序给出反应的结果.第一种药剂 和 第一种药剂反应 生成哪种药剂 ,放出多少热量第一种药剂 和 第二种药剂.........(一共m*m)行;然后给出药剂的药量.一共有k瓶.每瓶分别是什么..问反应到只剩一瓶药剂为止,最小的放热.用一个六维数组,保存6种药剂剩下原创 2014-12-27 22:27:31 · 343 阅读 · 0 评论 -
uva10453(DP 回文)
题目的意思就是给你一个字符串 ,你要加最少的字符让它变成回文,并且输出变化后的,.首先是普通的dp. f[ l ][ r ]表示把 l 到 r 变成回文,最少添加个数 if(str[l] == str[r]) f[l][r] = dp(l + 1 , r - 1); else { int a = dp(l + 1 , r) + 1; int b = dp(l , r原创 2014-12-11 21:25:34 · 440 阅读 · 0 评论 -
uva11176(dp + 概率)
题意:有n场比赛,每场赢的概率是p,问连续赢的期望值思路:f[i][j]表示的是第i次,连续赢的次数不超过j的所有情况的概率。如此以来 f[i][j] = f[i - 1][j]在扣掉不是该状态的情况的概率,即为多赢了一盘之后连续的情况超过j的情况,该情况只在末尾有j个连续赢的情况出现,所以要扣掉f[i][j] = f[i - 1][j] - f[i - 1 - j - 1][原创 2015-02-05 20:19:31 · 381 阅读 · 0 评论 -
uva10029(DP)
题目的意思就是从给出的按字典序排序的那 一串 字符串中,找到最到最长的一个子串.这个串满足,每一个都能由上一个一步变过来.(指改变一个字符 ,或者删除一个 , 或者添加一个) .如样例中的digfigfinfinewine首先我一开始用的是一个judge函数,把它和前面的所有去匹配,在匹配上的里面,找到最大值...超时没得商量...然后改了方法.我把和这个字符串原创 2014-12-13 20:48:24 · 440 阅读 · 0 评论 -
uva11008(dp + 状态压缩)
题目的的意思就是有n棵树,现在你要砍掉其中的m棵.你有一把枪,可以砍掉一条直线上的所有树,问砍掉m棵最少几枪.首先感谢Titanium的博客提供的帮助http://www.cnblogs.com/scau20110726/archive/2012/09/28/2707866.html参考了一下,虽然之前也做过状态压缩的题,但是就是没有往这方面想,看了下别人的题解才茅塞顿原创 2014-12-31 20:57:16 · 361 阅读 · 0 评论 -
uva10913(dp + 回溯)
题目的意思就是要从(1,1)那个格子走到(n,n)那个格子.并且途中只能经过k个负数.而且走的时候方向不能向上,其他方向都可以,还有走过的点不能再走.问路上经过的点的值加起来最大是多少,如果走不到就输出impossible;用来记忆的f数组要开四维,记录位置(x,y),经过的负数的个数,还有方向,刚开始没有考虑方向,错了很多发,因为就算同一个位置,经过同样多的负数,如果方向不同,也是不一样原创 2014-12-30 22:31:25 · 413 阅读 · 0 评论 -
uva10723(dp 最长公共子序列)
题目的意思就是给你两个串,然后你构造一个串,使这两个串都是它的子串.并且这个串要最短.问最短多长,还有构造成最短长度的方法有几种.首先我们可以知道,如果把两个串合并成一个串,肯定是可以满足条件的,但是不是最短的..而且如果是两个串的公共子序列,那么就可以只算一遍.所以最短应该是两个串长度的和,减掉两个串的最长公共子序列的长度.接下来是有几种方法.我们可以在算原创 2014-12-31 22:52:40 · 509 阅读 · 0 评论 -
uva607(DP)
题目的意思就是教授要上课,有n个主题要上.但是每节课时间有线=限,只有l分钟.一个主题必须在一节课内讲完,不能一个主题分两节课,而且主题的顺序并须按给出的顺序.如果这节课剩的时间太多,学生会不满意.剩余时间t如果大于10.那么不满意度增加(t - 10)的平方.如果小于10,反而会减少一个定值c;首先给出有几个主题,然后给出一节课的时间,和c(剩余时间在10以内,不满意值减少的量)原创 2014-12-26 20:37:53 · 457 阅读 · 0 评论 -
uva10201(DP , 车加油)
题目的意思就是你要从起点开车到终点去,每开一公里消耗1L的油,你刚开始有100L油.油箱最多200L;然后给出沿途哪些地点有加油站,这些地点1L油的价格.(起点和终点都不加油.问到达终点时,油箱里要剩100L油 的最小花费...首先我们用f[i][j] 代表在第 i 个站点. 剩下 j L油的最小花费那么我们可以得到状态转移方程f[i][j] = min{f[i][j],f原创 2014-12-11 12:29:53 · 384 阅读 · 0 评论 -
uva10564(DP+路径打印)
这题的意思就是给出一个沙漏,第一行的两个数字n , s ;n就是沙漏的大小,最上面一行元素的个数,s就是目标权值.要求问从第一行到最后一行所有路径中权值为s的路劲有几条.然后输出字典序最小那条路是从第一行哪一个位置开始的(第一个是位置0),并输出这条路.首先,我们记(i,j)这个点权值为num[i][j] ,比如我们要知道从(i,j)这个位置到最后的权值为s的路径有多少条那么我们要原创 2014-12-22 23:07:29 · 460 阅读 · 0 评论 -
uva10271(DP)
题目的意思就是 一个人吃饭要用3根筷子(简直有病),假如他拿的三根筷子长度从小到大是a,b,c 那么他的消耗就是(a-b)的平方(较短的两个);现在有k个人要来吃饭,所以我们要准备k+8副筷子(3枝一个人),总共有n根筷子..问怎么选筷子消耗最少,最少是多少.首先我们用一个d[ i ][ j ] 数组.表示用前 i 个筷子,配成 j 副筷子的最小消耗.那么可以确定转移方程d[ i ][原创 2014-12-07 19:29:00 · 533 阅读 · 0 评论 -
uva10617(DP)
题目的意思就是给你一个字符串,你可以删除其中的一些字符,问有几种方法使他变成回文(什么都步删也算一种)首先d[ i ][ j ] 代表从第i个 到第j 个变成回文,有几种办法.我们可以知道 他会等于删除左边那个元素后的办法 d[ i + 1][ j ]加上删除右边那个元素后 d[ i ][ j - 1];但是有一个问题就是删除左边的包含两边都删除的,删除右边的也是,那么两边原创 2014-12-08 13:13:00 · 435 阅读 · 0 评论 -
uva662(区间DP)
题目的意思就是有n个饭馆,然后要在其中k个饭馆建仓库,每个饭馆要从离他最近的仓库补给,每个仓库在哪,补给了哪些仓库,所有饭馆到仓库的距离和.(距离要最短);dis[i][j] 就是在i和j之间只有一个仓库,那么i到j所有距离和.(就是ij间所有点,到第(i +j) / 2 这个点的距离和);f[i][j]就是在前j个点,放i个仓库的最小距离.专题转移方程就是:f[i][j] =原创 2014-12-23 21:48:55 · 430 阅读 · 0 评论 -
uva11137(DP)
题目的意思就是有21种面值的硬币,面值分别是1,8,27....一直到21的三次方9261.然后问组成目标面值有几种办法.这题和uva147是一样的题,直接看那题的题解.http://blog.csdn.net/yeyeyeguoguo/article/details/40343123AC代码:#include#include#define ll lon原创 2014-12-09 19:47:10 · 330 阅读 · 0 评论 -
uva10154(DP叠乌龟)
题目的意思就是有很多只乌龟,每只乌龟有重量和力量.如果一只乌龟重量300,力量1000,那么它的背上还能在放重量700的乌龟.那么我们一颗知道,越在下面的乌龟,力量肯定越大,那么先把力量从小到大排.然后从上往下找乌龟.f[ i ][ j ] 代表用前i种乌龟,叠了j层,最小的重量是多少.现在加入我们要在放入一只乌龟了.我们考虑第 i 只这只要不要.那么这只乌龟放进去的条件是什么 ?原创 2014-12-09 21:13:41 · 663 阅读 · 0 评论 -
uva10626(硬币DP)
题目的意思就是要其自动贩卖机买可乐.一瓶8块.硬币面值有1,5,10;给出你要买的瓶数,和1 , 5, 10 的硬币的个数.要问最少投币几次,买完可乐.你买可乐可以选择,投1个10元,找回2个一元(投币一次)投两个5元,找回2个一元(投币两次)投一个5元,三个1元 (投币四次)投一个10元 , 三个1元 ,找回一个5元 (投币4次)投8个一元 (投币8次)然后把各个情况原创 2014-12-24 17:29:53 · 706 阅读 · 0 评论 -
uva10118(DP + 回溯)
题目的意思就是有四堆糖果.你每次可以取走每一堆顶部的糖果放在篮子里,篮子里最多只能放5个,如果里面有两个颜色一样的,就可以从篮子里拿走,带走.输入第一行,是每堆有几个.然后给出糖果的颜色(数字)问最多带走几 对 糖果.(两个一对)f[i][j][k][l] 表示第一堆拿走了i 个,第二堆拿走了j个 ,第三堆拿走了k个 ,第四堆拿走了l个后,可以带走的糖果对数最多多少.首先我们每原创 2014-12-25 18:47:13 · 411 阅读 · 0 评论 -
uva11258(DP)
题目的意思就是给你一大串数字.把他们分割成几个数字.每个数字不能超过int 就是 (1 << 31) - 1;要求分割出来的数字和最大....首先(1 << 31) - 1 是2147483648 是一个10位数,也就是我们最数字,最多只能切出一个10位数,而且如果太大,只能切9位..那么我可以这样递归,把第一个数字切出来..剩下的递归算,或者.把前两个数字切出来..剩下递原创 2015-01-01 18:41:52 · 468 阅读 · 0 评论 -
uva10817(01背包 +状态压缩)
题目的意思就是有个学校要招老师.要让没门课至少有两个老师可以上.每个样样例先输入三个数字课程数量s,已经在任的老师数量,和应聘的老师数量.已经在任的一定要聘请.首先先说怎么状态压缩,课程最多8门,但是每门课要有2个两个老师,所以状态要有16位,第一位和第二位代表第一门课.一开始所有状态都是1.如果这门有一个老师可以上了.那这一位就变为了0,所以最终状态是0;处理已经在任的老原创 2015-01-03 22:58:35 · 1066 阅读 · 0 评论 -
uvalive4256(DP)
题意:给出一张图,然后给出一个序列,修改序列中一些数字,要求使这个序列相邻的两个点.要么是相同的点,要么在图中是相邻点;思路:dp[i][j]代表序列前i个,并且第i个的值是j ,满足这一关系,最少修改几次几次;那么dp[i][j] = min ( dp[i - 1][k]) (k与j是相连的);#include#include#include#incl原创 2015-03-23 18:22:57 · 488 阅读 · 0 评论 -
uvalive4394(区间DP)
题意:给出两个字符串;每次可以选择第一个字符串的一个区间,全部刷成某一个字母;问最少刷几次可以刷成第二个串;思路:首先我们可以假设第一串和第二串完全不一样,那么刷出第二串要几次,相当于把一个空串刷成第二串;这时候可以用dp[i][j]把(i,j)刷成功要刷几次这时候如果中间k的位置有一个字母和i的位置相同;那么就可以dp[i][j] = min(dp[i][j]原创 2015-04-13 19:42:10 · 701 阅读 · 0 评论 -
uva12260(DP)
题意:P和J两个人捡到了一包糖果;有n个;现在两个人要分赃,一人拿一个直到拿完;每一颗糖果对两个人的价值是不一样的.现在P采取的策略是,每次都取当前糖果中对自己价值最大的,同时队J价值最小,好让J取到的价值更大(好基友,辈子);J采用的策略是,要让自己最终的价值总和最大,但如果保证最大的情况下,会采用让P取得价值最大的策略(好基友是双向的);;问最终两人能取多少价值;输入组原创 2015-04-14 19:29:05 · 578 阅读 · 0 评论 -
uva12265(dp)
题意:遍历图;找出每一个'.'作为右下角的最大的矩阵周长;思路:维护每个位置向上的最大生长高度,然后按照每一行去枚举列,维护一个单调队列,使得高度递增,让周长最优。对于每个新的长度,将比它高的直接忽略。AC:#include #include #include #include using namespace std;const int N = 1e3+原创 2015-04-14 12:23:54 · 798 阅读 · 0 评论 -
hdu5135(状态压缩DP)
题意:给出n根木棍,随意组成几个三角形,问组合的面积最大是多少;思路:用状态压缩,首先把可以组成的三角形的合法情况全都放进vector里,然后枚举;#include #include #include #include #include using namespace std;int s[12], n;double dp[1<<12];vector原创 2015-08-22 15:09:49 · 709 阅读 · 0 评论 -
hdu5273(区间DP)
题意:给出一个区间,问这个区间逆序对有几对;思路:[l, r]的逆序对就等于[l + 1, r] + [l, r- 1] - [l + 1, r - 1]如果l 和 r也构成逆序对,就再加一;#include #include const int N = 1005;int dp[N][N], num[N];int main() { memset(dp,原创 2015-08-24 19:42:08 · 768 阅读 · 0 评论 -
hdu5366(DP)
题意:在1*n的格子上放木人,两个木人之间间隔至少为2;问至少放个一个木人的情况有几种;思路:DP[i]表示长度为i的方法;如果不在第i个位置放,那么有DP[i - 1]种方法;如果在i这个位置放,那么有DP[i - 3] +1种方法;所以DP[i] = DP[i - 1] + 1 + DP[i - 3]#include #include原创 2015-08-23 19:56:27 · 423 阅读 · 0 评论 -
uvalive3516(DP)
题意:给出一种遍历多叉树的方式,就是总是向左,左走不同往回走,然后向右,遍历完整棵树,并回到原点;图上五棵树的遍历结果都是ABABABA;现在给出一个字符串,问能表示几棵树;思路:首先如果我们要算一个字符串ABABABA的组成树的数量,我们可以通过计算它的子树,即组成AB的棵树乘以组成ABABA的棵树,然后找到所有的组合方式加起来;那么就可用dp,因为要回到原创 2015-07-22 21:47:31 · 517 阅读 · 0 评论 -
hdu5045(dp + 状态压缩)
题意:给出n个人,m道题;每道题只能一个人做;现在给出n行m列.是每个人做每一道题的成功率;你现在要选出哪些人做哪些题,使成功率和最大.但是有一个条件做到任意一题时,做最多的人只能比做最少的人多做一道;就是如果10个人,那么前10题必须一人一题;思路:因为限制条件,所以前n道题,必须分给n个人一人一道,那么每人只能做一次;那么用状态压缩表示哪些人做过了;比如5个原创 2015-03-17 21:05:06 · 919 阅读 · 0 评论 -
hdu5000(dp)
题意:克隆人有n个属性,给出每个属性的最大值T[i];属性值可以是0-T[i];如果A的所有属性都不比B低,那么B就不能存活,问最多存活多少人;思路:如果两个人的所有属性值的和是一样的.那么要么这两个人完全相同,要么这两个至少有两个属性一高一低(也就是可以一起存活);所以如果有m个人属性和全都一样,那么这m个人就能全部存活;让他们的属性和达到(T[1] + T[原创 2015-03-09 20:32:09 · 772 阅读 · 0 评论 -
uva10599(最长增长子序列)
题意:有一张图,上面有垃圾.现在要让一只机器人去捡,机器人要从(1,1)走到(r , c),但是机器人只能向下和向右走,问最多能捡几个垃圾,有几种方式捡(注意这里的方式不是路径,而是捡了哪些垃圾);然后输出字典序最小的方式(每个格子都有编号,从1开始,所以(i,j)的编号是(i - 1) * c + j)输入先是给出图的大小,r*c;然后给出若干个点,这些点有垃圾.思路:因为不原创 2015-01-01 23:13:21 · 416 阅读 · 0 评论 -
uva10163(DP)
题意:有n个仓库,现在要请m个保安来看守.每个保安有个能力值Pi,Pi值为多少,这个保安最多就能看守多少个仓库.同时也是聘请这个保安的工资.如果这个保安看守k个仓库,那么每个仓库的安全系数就是Pi / k (整除);如果一个仓库没有保安看守,那么安全系数就是0;总安全系数L 就是所有仓库中安全系数最低的那个仓库的值.现在我们要求L最大是多少,并且求L最大情况下,最小的工资Y;原创 2015-01-04 16:41:38 · 452 阅读 · 0 评论 -
uva10280(完全背包+剪枝)
题意:有n升的酒(n*1000毫升);然后有m种瓶子,每种瓶子有最小装酒量,和最大装酒量(单位:毫升),瓶子数量不限.问最少剩下多少酒不能装进去.思路:我们可以把酒瓶子分解,比如瓶子容量725 - 750;我们就把它变成容量为725 到 750的26个瓶子.然后用完全背包做.但是酒的量太大,直接做会超时,所以我们要剪枝.我们可以想象,如果我们用10 - 15的瓶原创 2015-01-05 19:52:51 · 600 阅读 · 0 评论 -
hdu4734(数位DP)
题意:求f(0)~f(B)中,有几个小于等于 f(A)的;函数f 就是把一个数字一位位分开,右边开始 第一位*2^0 + 第二位*2^1....第n位*2^(n-1);思路:数位DP;dp[i][j]表示第i位比j小的数有几个;#include #include int A,B,dp[11][50000],a[25];int len;int f原创 2015-03-19 20:04:51 · 1324 阅读 · 0 评论 -
hdu5024(dp)
题意:王熙凤不想让贾宝玉和薛宝钗住的很近(因为如果他们在一起,薛宝钗有可能取代王熙凤)现在'.'是路,'#'是墙;要让贾宝玉和薛宝钗住的尽量远;所以选一条最长的路,让他们住在两端;这条路最多一个转折,并且是90度;像下面这张图:#.###...#最长的路是(图中*的位置)#*###*.*# 长度为3;思路:计算出每个点原创 2015-03-16 20:55:55 · 630 阅读 · 0 评论 -
zoj3816(dfs + 数位DP)
题意:给出一个数n,从比n小的数中选出一个最大的;满足压缩完是回文数,压缩指连续的相同数字,只算一个;如1221就算做121;1121算作121;思路:我们就是要从左边开始构造一个数;首先我们在第一位放了一个数字;那么我们就要在最后一位放一个数字,为了让他们对称;但是有几种情况,只需在左边放一个,而不需要在右边放;就是出现重复数字的时候还有只剩一个位置的原创 2015-03-07 21:11:11 · 640 阅读 · 0 评论 -
hdu5001(DP+概率)
题意:给出一张图;n个点,m条边,然后走d步;问走d步不经过第i个点的概率(输出n行,每个点算一次)思路:dp[i][j]代表走d步到达j点的概率;我们可以知道dp[0][j] = 1.0 / n (还没走,以每个点为起点的概率是一样的);然后我们还可以知道dp[i][j] = dp[i - 1][v[j][k]] / v[j].size(); 就是第i步到j,原创 2015-03-08 19:00:07 · 395 阅读 · 0 评论 -
uva11584(暴力DP)
题意:给出一个串,把它切成尽量少的串,使每个串都是回文;思路:dp[i]表示前i个字符最少能划分成几个串;枚举j 如果j 到 i是一个回文;那么dp[i] = dp[j - 1] +1;找出最小值;AC:#include#include#includeusing namespace std;const int N = 1005;char st原创 2015-03-20 19:37:22 · 740 阅读 · 0 评论 -
uva10911(集合DP)
题目的的意思就是给出n 然后给出2 * n个点.两两分成n组,距离和最小.集合上的动态规划模板题:用状态压缩表示所有状态下,的最优解.AC代码:#include#include#includeconst int INF = 0x3f3f3f3f;const int N = 20;const int M = 1 << 20;char name[25];str原创 2014-12-21 19:49:34 · 429 阅读 · 0 评论