??xml version="1.0" encoding="utf-8" standalone="yes"?>
题意大概是l你一大堆的城市,左边的数表示q个城市~Z么物资,双的数表示那个物资从哪个城市往里运Q两个城市之间需要链接道路,问不交叉的情况下Q最多能q多条。这道题原本应该是一个最长公共子序列Q但是无奈他l的数据范围太大QLCS的做法明显不满Q所以首先我们可以把双的数映射到左Ҏ(gu)Q这样就转化成求最长不下降子序列的问题Q对于最长不下降子序列,有一UDP+二分的求法,可以在nlogn的情况下完美解决?/p>
思\大概是dp数组记录的是到当前长度的最靠前的元素,每遇C个新元素Q在dp数组中二分查扑ֈ于它的最大元素的位置Q在那里更新到它的最长不下降子序列,q个法牛逼就牛逼在二分那一步了Q否则也不会(x)做到nlogn的时间复杂度
1003是喜M见的最大连l子串和Q经典的动态规划题目,l典归经典,我确实是刚刚?#8230;…在这道题中,我们需要保证的是在计算q程之中Q计的和是一直增加的Q如果碰C让和减少的元素,直接把和更新?Qƈ且更C(f)旉指针Q每扑ֈ一个更优的解,把真正的首指针和指针更斎ͼ整个q程中一直保证的是和是递增的。注意我说的是非全负的情c(din)?br />
q道题厉害了Q要求在n个数里面求m个最大子D和Q要求最l的和最大,其实是计算mơ,因ؓ(f)q此不用记录区间的首օ素,所以其实比上一道题好写一些?br />
题目大意是l你一个字W串Q和字符串中每一个字母删除或者添加所需要付出的代h(hun)Q问把它变成一个回文字串所需要的最的代h(hun)?/p>
首先明确一个问题,如果我们在字W串中某一个位|删除一个字W,那么一定能扑ֈ一个等L(fng)d的方法,所以可以把删除和添加统一CP然后q道题的状态就单了?/p>
dp[i][j]表示的是区间[i, j]内Ş成回文串所需要的最的代h(hun)Q这h们就可以׃个单位字W向外扩展,状态{ULE就应该是dp[j][i] = min(dp[j + 1][i] + cost[s[j] - 'a'], dp[j][i - 1] + cost[s[i] - 'a'])Q另外如果区间的首尾字符都是一L(fng)话,那么首尾字符全都删去q是一个回文串Q这样一来再把两个代价做一个比较就可以了吧?br />
当然Q其实最初的x是扩展出来四个状态,是首删除,首添加,ֈ除,添加,由此扩展开来求一个最|不过看了一下解题报告,再加上和学长们YY一?x)儿Q发C可以l一的问题,想出来了?br />
q道题的最l结果还是求助得来的Q天Q又是求?#8230;…只求做一道会(x)一道吧?/p>
状态dp[i][j]表示当用了前i个物品,q度ؓ(f)j的挂法的数量Q题里面要求的应该是求所有g个物品挂上去以后Q^衡度?的挂法吧Q好吧,暂时先不它Q极端情况就是所有的物品都挂在最q端Q那极端情况应该是25*20*15=7500Q按照题意,应该是左边7500Q右?500Q范围应该是[-7500..7500]Q移植到C语言里面是[1..15000]Q所求的是dp[g][7500]?/p>
如果Wi个物品挂在某一个挂钩上Q一定在挂上前i-1个物品的所产生的某q度的基础上生了一个新的^衡度Q不同的挂钩q度不同,Wi个物品挂在每一个挂钩上面所产生的新q度的挂法都要加上前i-1个物品所产生的旧q度的挂法Q方E有点儿ȝQ先不列了,攑֜下面的代码中好了……
特别鸣谢Q翔哥zzxyyx_1
q道题我真心不会(x)?#8230;…
题意的话按题查询好了Q我p我求助加上YY的解题好?#8230;…
当然Q看了那个纠l的题意我果断的p虐到了,额啊Q神题啊……l跪……
首先Q既然疲力_是做差,那排个序好了Q有序状态下盔R两个做差是尽量小的?/p>
?态是dp[i][j]表示在前i个物品中扑ևj对得疲力_最,有一个决{就是第i个物品用q是不用Q如果不用的话,前i个物品的疲劳度一定是{于?i-1个物品找出j对的疲劳度,如果用了Q那用的一定是Wi个和Wi-1个,那就应该{于前i-2个物品中扑ևj-1对的最疲力_加上q两个物品获得的 疲劳度。状态{ULE:(x)dp[i][i]=min(dp[i-1][j],dp[i-2][j-1]+(w[i]-w[i-1])^2)。然后就写代码好 ?#8230;…
?sh)脑正在升pȝQ我上来E稍溜达溜达?/p>
今天扄哥给我讲了讲动态规划,真心受益Qؓ(f)了防止以后忘了,ȝ一下先?/p>
哥是从L一个有向无环图的最短\讲v的,有向无环囄讲法参看《算法导论》,在这里我׃重复说一遍了Q因为我实在是没有办法把囄出来?/p>
实际上磊哥解决了我的一个疑惑,利用他的l验?/p>
?动态规划题Ҏ(gu)来说最为闹心的是L状态,L最优子l构Q貌D两个一有困隑֊态规划的题根本就没法做了。磊哥告诉我的做法就是枚丄态,所谓枚丄 态就是把q道题所有可能当状态的东西都列出来Q然后一个个去进行排除。排除的q程是这L(fng)Q首先要q行定义Q也是说要明确q个状态到底是什么,有什么用 处,然后再用q个状态画有向无环图,如果L向无环图的过E中推理出由q个状态,后面的根本无法实现或者说出现了矛盾,那么q个状态就是错的,最l一定能 够枚丑և来一个正的状态?/p>
/*一说到枚DQ就要考虑一下时间复杂度Q但是我认ؓ(f)q个可以忽略不计Q就是对于来说Q因Z道题之中貌似能找出来的状态应该不能超q手指能查找的范围。好吧,以上是仅供娱乐的题外话?span style="font-family:DejaVu Serif , serif">*/
?丑և来一个正的状态之后,那么pq入下一个纠l的状态,那就是寻找最优子l构Q磊哥的做法我认为非帔R明,那就是我前文所提到的有向无环图Q以状态当 l点Q{化关pd作边权,L向无环图Q然后参照着有向无环囄那种方式来寻找最优子l构Q但是纠l的是怎么做边权,q个实闹心Q这块硬骨头只能是一 点点d了?/p>
最优子l构推出来以后,下一步就是推状态{ULE,q个没有别的办法Q就是用最优子l构中所体现的{化关pL推状态{ULE了……
以上q些是磊哥给我讲的东西的ȝ版,目测回忆h应该是全的,然后按照哥的指令(也是执行飞哥说的q个月开始推动态规划的计划Q,应该l箋L动态规划入门,哥的意思是做一堆水题练l思想Q那么就做吧……然后应该百度一?span style="font-family:DejaVu Serif , serif">DP水题Q开始刷Q刷一D|间水题吧Q怎么说呢Q练l思想Q先入了动态规划的门,高动态规划有我啃的呢Q?/p>
飞哥l我定的计划应该是严格执行的Q然后我自己定的那个比较山寨的学?fn)计划也应该执行下去Q毕竟数据结构也是个伤,本学期好歹要把数据结构基拿下了,动态规划入门了……
我承认,q道题我做了很久Q大概是三天?#8230;…所以应该把q道题答案放出来……
啃动态规划嘛Q那肯定是动态规划啦Q?/p>
题目大意是有NU木块,每种无限个,有长宽高QQ意两个当底,一个当高,把这些木块摞hQ上面的木块长和宽都必须比下面的,问最高能摞多高?
?吧,q道题刚开始看到的时候我果断看成了一个无限空间的背包问题Q但是马上我发CbugQ如果真的是当背包做Q第二重循环怎么写啊……然后开始枚丄 二个状?#8230;…f[i]表示当第i个木块ؓ(f)时的最高高度,每一个木块都得比它下面的木块,仔仔l细xp发现一个木块只能用三个Q那么好吧,存储的时 候一个当成三个存好了……
遇到q种情况我喜Ƣ用l构体,因ؓ(f)q样一个变量就可以存入一个木块的所有的参数Q果断就是组合数Q长宽高那么存 p了,而且长永q比宽长Qؓ(f)了保险,以所有木块的长ؓ(f)主进行排序。然后开始做Q第i个木块ؓ(f)Ӟ然后开始扫它底下的木块Q因Z先排q序了,在i下面?木块只能是i之前的而且宽比i的木块Q实际上Q愿意扫全场也行Q?/p>
最优子l构是当Wi个ؓ(f)ؓ(f)最高的时候,i的下面一定存在一点kQ当W?k个木块在最上的时候,使得高度最高,然后以k为最底,当第i个木块在最上的时候,使得高度最高,q样一来整体高度最高。说实话Q我惌当摞了前i?木块Q得高度最高的子结构,l果我就发现了每个木块都有三U摆放方式,然后是一个大bug——Ҏ(gu)无法实现好不?#8230;…
最优子l构扑ֈ了,然后是写方E了?/p>
方程那段的代码:(x)
if (f[i] < f[j] + a[i].g) f[i] = f[j] + a[i].g;
a[i].g是第i个的高,j表示的是i下面的那个,每一步都要有一个初始化Q就是f[i] = a[i].g?/p>
好了……写完了?/p>
PSQ其实这个灵感来自于哥的一个指?#8230;…原版是f[i, s]表示当第i个以s方式为顶的时候,最高的高度Q然后我觉得木块的变化有炚w深,干脆把一个木块当成三个木块了。。?/p>
特别鸣谢Q磊哥ZLGG
?#8230;…q道题貌g不怎么强大Q但是着实让我纠l,所以我又开始求助了Q然后求助成功,解题Q然后脓(chung)上来Q以免以后忘?#8230;…
题目大意是这L(fng)Q给一D|间NQ给M个时间段Q给开始时间和l束旉Q每个时间段有一个效率,每次用完某一旉D늚效率必须休息R时Q求最高的效率?/p>
好吧Q存储结构没有异议,一个量Q三个参敎ͼ果断的结构体存储啊,方便得体Q多好啊……
?开始我果断的打把它当成一?1背包来做Q但是果断的错了Q被我自己否决了Q还好没?#8230;…Q我的想法是直接把每一D늚l束旉减去开始时_(d)然后成ؓ(f)一个消耗时间段Q然后抽?#8230;…N代表背包d量,M代表物品个数Q消耗时间段代表着物品占用的空_(d)效率是物品价|一个华丽丽?1背包解决……当然q?个错了,原因是既然给了每个时间段的开始时间和l束旉Q还有休息时_(d)那如果重叠了怎么?#8230;…然后果断的否决了?/p>
实际上正的状态是?选用Wi个时间段为结时候,所获得的最大效率,当然得把旉D늚先后先排个序Q按照开始时L序,q样比较有爱……q样的话当处理第i个时间段也就?f[i]的时候,之前需要计的都在WiD늚前面。当处理到第iD늚时候,前面必然有一个jQ得以j为结时候,所得效率最大,从而保证到WjD늚最 大效率加上第iD늚效率最大,j可以是i前面的Q意一D|_(d)反正保证了最大就行。初始化的时候要有这么一句:(x)f[i]=in[i].efQ这样就是防?有前面所有段全都不用q种情况。方E是q样的:(x)f[i]=max(f[j]+in[i].efQf[i])Qin[i].ef是第iD|间中的效率?/p>
但是一定要注意一点,选用的时间区间除了端点以外是不能重合的,q得记得把休息时间加?#8230;…
特别鸣谢Q翔哥zzxyyx_1
好吧Q我真心知道Q这道DP真是C定䆾儿上的水Q但是我q是军_把它贴上来?/p>
题目大意是用n?或?l成一个序列,每两?不能盔RQ问又多种l成Ҏ(gu)?/p>
E稍考虑了一下,肯定是先考虑Wi个数的时候有几种Q第i个数嘛,不是0是1Q于是乎Q考虑Wi-1个数Q如果第i个数?Q那Wi-1个数放什么都无所谓,如果Wi个数?Q那Wi-1个数只能放0Q貌D个状态还是非常好认的是?#8230;…
f[i][0]表示Wi个数?的时候,有多种放法
f[i][1]表示Wi个数?的时候,有多种放法
Ҏ(gu)前面的推|f[i][0]=f[i-1][0]+f[i-1][1]Qf[i][1]=f[i-1][0]?/p>
然后q道题就没有然后了,只是丢h的是……我竟然因为少打了一个回车错了好几次……?#8230;…orz?/p>
q道题好象是能证明出来是个斐波那切数列,是不是的我不了Q反正当DP做是A?#8230;…
好吧Q这道题很水其实Q我想的也不慢,l箋入门d……