• {POJ}{动态规划}{题目列表}


    动态规划与贪心相关:

    {HDU}{4739}{Zhuge Liang's Mines}{压缩DP}

    题意:给定20个点坐标,求最多有多少个不相交(点也不相交)的正方形

    思路:背包问题,求出所有的正方形,然后求最多有多少个正方形不互相覆盖,这题真是神思路。

    {POJ}{3846}{Mountain Road}

    题意:给定两个地点车的班次,路是双向单车道,求安排最短的时间

    思路:对车次序列进行二维DP转移,转移的时候需要注意时刻的维护。这个题目的DP思路是正向DP,每次遍历到f[i][j]都需要更新之后的序列,类似于背包问题的正向解法,这一点需要多思考一下,也是此题的重点所在。总体来讲是一道非常不错的DP题目。

    {POJ}{3971}{Scales}{O(N)动态规划好题}

    题意:给定一堆2二进制砝码,给定一个物品,要求在天平两端加入物品和砝码使之平衡,求可能数。

    思路:一开始想到了直接用数学原理,结果没证出来。做如下思考,此题需要用二进制:

    (1)设物品重量为w,加入的砝码重量为x,另一边重量为y,便有w+x=y。

    (2)另外,假如物品为100110,加入的砝码可以为000010,那么总和为101000,显然x与y不能有位数相同的1(因为每种砝码只有一个),因此便有x&y=0

    依据这两点,可以知道此题的关键之处就在于如何分析w+x的进位情况。分析物品的第i位,比如为1,那么如果前面的一位没有进位,那么他便可以加上 1或者不加;如果进位,那就肯定不能加1(因为加1以后与进位的1加上这一位的结果还是1,与x&y=0矛盾),所以对于每一位,它的进位与不进 位情况需要分开判断。

    {POJ}{3934}{Queue}{DP}

    题意:给定不同高度的人(n),求使其有m对之间互相不遮挡(二人高度都高于之间人的高度)的人一共有多少种情况。

    思路:加入一个人时考虑在中间还是两边,中间的话就会增加两对,两边增加一对,依此可以建立DP方程。

    {POJ}{3988}{Software Industry Revolution}{DP好题}

    题意:给定一个字符串d,要求用另一字符串s去匹配,其中s中的?可以为任何字符,*可以为任意个字符,求最小的匹配权值

    思路:这题和CSDN英雄会的“反相互”类似,由于其中某些字符的不确定性,利用动态规划来对每个字符求解。只 不过这个题更灵活了一些,但是本质是一样的。考虑s中的第i个元素,当匹配到d中的j元素时,用f[i][j]记录最小的权值和,关键问题就是如何分析 '?'和'*'这两个元素。(1)对于'?'比较简单,直接匹配上就可以,f[i][j]=f[i-1][j-1]+Offset(2)对于'*',需要利用前面所有的信息求出最小值,但是题目N=10000,显然N^3的算法是行不通的,但是仔细考虑在遍历字符串d时,这个 值是线性增加的,因此就可以利用这一点来构造N^2复杂度的算法,面对'*',可选的值有f[i-1][j-1],f[i-1][j]和f[i][j- 1]三项,从中可以提取出'*'的最优状态。注意:此题的思路不难,但是时间卡的很紧,而且利用滚动数组压缩空间导致了数据边界问题特别严重,需要多多注意。

    {POJ}{3920}{RIPOFF}{DP}

    题意:给定序列,从序列左端向右最多每隔s步选取点,并且总选取的点不超过t个,求所选取点和的最大值

    思路:由于要执行最多t步,因此可以依此来dp每层状态,dp[t][i]=max{dp[t-1][i-s] ... dp[t-1][i-1]}+val[i];这样,最终遍历dp[1...t][n+1]就是最大值。此题需要注意数据的初始化工作。

    {POJ}{3903}{Stock Exchange}{nlogn 最长上升子序列}

    题意:求最长上升子序列,n=100000。

    思路:O(N^2)铁定超时啊。。。。利用贪心的思想去找答案。利用栈,每次输入数据检查栈,二分查找替换掉最小比他大的数据,这样得到的栈就是更优的。这个题目确实不错,思路很好

    {POJ}{3997}{Stock Chase}{简单DP}

    题意:给定n个点,两个点之间有从属关系,并且这个关系可传递,给定t个关系状态,求其不合法状态。

    思路:没给定一个关系,就dp传递与其相关的所有关系,更新dp[][],简单的动态规划。

    {POJ}{2479}{Maximum Sum} (DP)

    摘要: 题意:给定n个数,求两段连续子列的最大和。思路:先从左向右dp,求出一段连续子列的最大和,再从右向左dp,求出两段连续子列的最大和,方法还是挺经典的。

    {CSDN}{英雄会}{火车调度}{贪心}

    思路:给定一系列时刻表,求能满足各个时刻的最小火车数量。由于是一个最优化问题,自然想到动态规划和贪心。从最早出发的火车切入,到目的地后便可以选择下一次满足的时刻表,贪心思想找最近的一个时刻表(关于贪心的证明可以参看《图论》中最大流的证明思路),反复直到找不到满足的时刻,车辆+1。之后重复该过程,一直到所有的时刻表被满足。当然,首先必须对两地的时刻表分别进行排序,复杂度O(N*N)。

    {POJ}{1036}{Gansters} (DP)

    摘要: 题意:有个伸缩门,门的宽度0~K,每个时间可以伸长或缩短1个单位,有N个流氓,他们在T时刻到达,如果这时门的宽度正好与他们的stoutness相等时,便可获得一定的收入,问最大的收入是多少。

    思路:典型的动态规划,用dp[t][k]来记录t时刻门宽度为k时的最大收入,由于这个值只与dp[t-1][]有关,所以可用滚动数组来实现,不然会超内存,另外存储流氓时还是利用struct来存放,否则内存不够

    {POJ}{3230}{Travel} (DP)

    摘要: 题意:有n个城市,一个人从i到j城市时,可以得到income[j]的财富,需要消耗cost[i][j]的财富,也可以选择不动,也就是呆在i城市,那么可以得到income[i]的财富,需要消耗cost[i][i]的财富,但每个城市的incom[]是随天数变化的,求出m天内这个人能获得的最大的财富值。

    思路:很明显的dp,用dp[m][i]记录第m天,在第i个城市时所能获得的最大财富值

    {POJ}{3132}{Sum of Different Primes} (DP)

    摘要: 题意:给定n和k,要求找出k个互不相同的素数,使其和==n,求这样的组合有多少

    思路:因为素数互不相同,自然想到了0-1背包,可是怎么背包却想了很久,因为多了一个限制:k,那么必须用两维数组来做,用dp[M][K]表示在组成M时,K个素数互不相同的情况,于是可以用0-1背包来对每个prime进行dp:  dp[m][k] = dp[m][k] + dp[m-prime[i]][k-1];

    {POJ}{2385}{Apple Catching} (DP)

    摘要: 题意:牛Bessie可以在两棵苹果树之间来回走,在连续的一段时间内,每分钟都从两棵树之间掉苹果,但同一分钟只有一棵树掉,Bessie一分钟只能在一棵树下接苹果,问在规定的步数之内,Bessie最多可以吃掉多少苹果。

    思路:此题用动态规划思想考虑,在第m次移动后,在t分钟所获得的苹果是根据第m-1次移动第t-1分钟 和 第m次移动第t-1分钟决定的。记f[m][t]为第m次移动t分钟时所获得的最大的数...阅读全文

    {POJ}{1179}{Polygon} (DP)

    摘要: 题意:给定一个多边形,顶点时数字,边是操作,问去掉一个边后,能得到最大的数字是多少,并且输出这些情况。这题是矩阵链相乘的变体,用dp做就可以了,但是要注意,两个负数相乘有可能也是最大的,所以一个状态的最大数和最小数都要记忆,最后寻找最大数就可以了。

    {POJ}{1716}{Integer Intervals} 贪心

    摘要: 题意:给定n个区间,求一个点集S,使每个区间最少有两个元素在s中。

    思路就是贪心咯,按区间的终止点(右边的点)从小到大排列,我们每次取区间最右边的点(所取的几个点是最优的),使这个区间内至少有两个点在s中,贪心的证明很简单,在纸上画一画就出来了。

    {POJ}{1065}{Wooden Sticks} 贪心

    一道贪心题目,题意:有n个木棒,分别不同的长度和不同的重量,一个机器需要处理这些木棒,如果第i+1个木棒的重量和长度都>=第i个处理的木棒,那么将不会耗费时间,否则需要增加一个单位的时间,问最少需要多少时间处理完(包括机器启动的时间)

    思路:我们把木棒按重量从小到大排列,而且相同的重量按长度从小到大排列,然后每次选取合适的木棒加入一个集合,这个集合木棒的顺序是按重量和长度递增的,也就是说这个集合只需要一个单位的时间就可以处理完,我们可以证明是最优的:因为我们已经对木棒进行了排序,那么我们每次选取的木棒是对以后放木棒影响最小的那一个,这样我们就会得到最优解。

    {POJ}{2029}{Get Many Persimmon Trees}

    摘要: 这题应该用树状数组做,可是第一眼看,想都没想就搜了...

    {POJ}{1157}{LITTLE SHOP OF FLOWERS}

    摘要: dp问题,不算太难写好之后一直不过,原因就是在第一列的初始化时,没有处理好。。。

    {POJ}{1050}{To the Max}

    摘要: 此题又是DP,我是看了结题报告才想出来的。。。。。。。。。。。。苦想了好长时间,就是一层纸捅不破,原来那就是应该加一个二维数组记录每行的前i个值得和,说白了就是记录一下状态,因为题意是一个二维矩阵和得优化,所以一维的状态时不能够满足的,看来DP还是没理解透彻

    {POJ}{1018}{Communication System}

    摘要: 此题是DP问题,可是我一直没有想出公式只能根据带宽来枚举,再采用贪心策略

    {POJ}{3927}{Priest John's Busiest Day}

    思路:贪心策略,按照中点排序,则可以证明应该尽量完成中点靠前的,这题小trick特别多,应该注意。中等难度的贪心。

    {POJ}{3926}{Parade}

    题意:可以转化为求给定一条路线上总长度不超过k的总权值最大的连续节点。

    思路:典型的动态规划思路,由于有k长度的限制,因此利用单调队列来处理所有节点,目的就是保持一个节点包含信息的单调性。由于是双向,因此需要左右各执行一次单调队列DP。另外,题目的数据量非常大,需要对IO进行处理。中等偏下难度的DP题目。

  • 相关阅读:
    find命令
    shell编程基础
    grep命令
    awk命令
    结对项目之需求分析与原型模型设计
    使用Git进行代码管理的心得
    软件工程的实践项目的自我目标
    第五次作业——团队项目——需求规格说明书
    调研android开发环境的发展演变
    结对编程总结
  • 原文地址:https://www.cnblogs.com/lvpengms/p/3915689.html
Copyright © 2020-2023  润新知