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,所需要的花费。
递推式为
(k<j) 。