kuangbin 专题十二 基础DP1

专题链接

A - Max Sum Plus Plus hdu1024

题意:
把一个有n个数的序列,分成不相交的m块,求这m块的和。
思路:参考此博主后得
假设当前数为第i个,该数有2种可能:
第一种是第i个数接入上一个的那一块中,dp[i] [j]=dp[i] [j-1] +all[i] ;
第二种是第i个数作为新的一块。dp[i] [j] = 前i个数中构成j-1块的最大和+all[i]。
详解在此

B - Ignatius and the Princess IV hdu1029

水题

C - Monkey and Banana hdu1069

题意:
有n种积木,每种无限量,可以任意翻转,现在要问能把这些积木叠多高,叠的时候要满足下一层的长和宽都必须大于上一层的长和宽。

题解:
因为这题n最大30,故也可以用搜索做。
详解见此

D - Doing Homework hdu-1074

题意:
有n项作业,每项作业需要时间c去完成,截至日期是在d,每一项作业每超过截至时间就会扣1分,现在问如何安排作业能使得扣的分最少,并且当扣分相同时,要选择字母序最小的那个作业安排。
题解:详解见此
难度:
dp好题,4颗星

E - Super Jumping! Jumping! Jumping! hdu-1087

题意:
有n个位置,每个位置有一个标号,player从起始点出发,每次只能往前跳,并且跳到的位置的标号要比上一次位置的大,途径的位置越多,分数越高,选择一种跳法,使得分最大。
题解:
详解见此

F - Piggy-Bank hdu-1114

题解: 背包思想

H - Tickets hdu-1260

题解:
对于每个有2种选择,要么单独,要么和前一个合并。而每一种是建立在前一种的最优情况上。

I - 最少拦截系统 hdu-1257

题解:
原则是尽可能选择相差少的,其实把每一个当做起始点,那么后面的是确定的。
没有给导弹数的范围,那么很可能是要一边读取数据一边算。

J - FatMouse’s Speed hdu-1160

题意:
给出很多老鼠的数据,每个数据包括老鼠的体重和速度,要选取尽可能多的老鼠,证明随着体重增加,老鼠的速度下降。
题解:
也就是要找到速度下降和体重上升的最长序列。

K - Jury Compromise poj-1015

题意:
有n个人,每个人有2个值,分别位d(j)和p(j),要选择m个人,使得这些人的|D-P|最小,|D+P| 最大。而 D=sum(d(j)),P=sum(p(j));
难度:
4颗星,有挑战,很锻炼思维。

L - Common Subsequence poj-1458

题意: 找最长公共子序列
难度: 经典模板

M - Help Jimmy poj-1661

**背景:**一个下跳一百层的小游戏,计算最少的时间。
难度:
3颗星,简单dp+思维考虑 代码在此

N - Longest Ordered Subsequence poj-2533

题意: 最长上升子序列
难度: 两颗星,模板题

O - Treats for the Cows poj-3186

题意:
双端队列里取数,每次取数都乘上它取出时的序列号,问和最大为多少
难度: 3颗星,简单dp

题解:
一开始看,以为是贪心,但是发现每次选择都会改变后面的选择范围,因而不是贪心。
相同的状态和可能不同,原因是过程不同,而每种状态dp[i][j](左边取i个,右边取j个),必然是由 dp[i-1][j]或者dp[i][j-1]转移过来。
代码见此

P - FatMouse and Cheese hdu-1078

题意:
一个n*n的格子,从左上角第一个格子出发,每次最多走k个格子(each time he can run at most k locations to get into the hole before being caught by Top Killer.),后走的格子要比之前走的格子的值大,问走的值的和最大为多少。
题解:
显然,第一会想到的是dfs搜索枚举,但是会tle,用dp[x][y] 记录从(x,y)出发的可得到的最大和,这样就可以减少对一颗小树枝的再次遍历(想象搜索递归这个图)
其实是经典的搜索加速题。
难度:
3颗星,经典搜索

Q - Phalanx hdu-2859

题意:
给你一个n * n的字符矩阵,从中选出一个最大的子矩阵(m*m)满足关于斜对角线(左下角到右上角)对称,求出这个矩阵的大小m。
题解:

dp[x][y]表示以(x,y)为左下角点的矩阵。
从(i,d)做出的对称矩阵,那么一定是在dp[i-1][d+1] 基础上做出的对称矩阵,且max(dp[i][d] )=dp[i-1][d+1]+1。1 <=dp[i][d] <=dp[i-1][d+1]+1。

//核心代码
 for(int i=1;i<=n;++i)
        for(int d=n;d>=1;--d)
    {
        int s=dp[i-1][d+1];
        int t1=1,t2=1;
        while(t1<=s&&i-t1>0&&d+t2<=n&&mp[i-t1][d]==mp[i][d+t2])
        {
            t1++;t2++;
        }
        dp[i][d]=t1;
        ans=max(t1,ans);
    }

R - Milking Time poj-3616

题解:
用hdu1078的搜索解法做行,也可以用简单dp做。

S - Making the Grade poj-3666

题意:
给一个有n个数的序列,修改这个序列的数使得他们是呈现递增或者递减,问修改的最小幅度和是多少。
难度:
题目很经典,以前赛场上遇到过,没做出来,现在又见面了。
题解:
这个博客里,博主写的很清楚,为什么说用到了离散,因为离散是对最简单的dp式的简化,不用那个会超时。
dp[i][j]表示 到第i个楼梯的时候,高度是j,所需要的花费。
递推式为 d p [ i ] [ j ] = d p [ i 1 ] [ k ] + a l l [ i ] j dp[i][j]= dp[i-1][k]+ | all[i]-j| (k<j) 。

发布了114 篇原创文章 · 获赞 22 · 访问量 7009

猜你喜欢

转载自blog.csdn.net/qq_43235540/article/details/103993402