这周做题的时候,遇到了几个背包问题,于是在B站上将所有的背包问题代码实现以及实现过程详细学习了一遍。在上学期的时候,背包问题讲的比较仓促,当时懂得也不是很多,就挺难理解的,这次复习之后,对背包问题有了更深刻的认识,比想象中的要简单许多,状态转移方程不论是一维数组还是二维数组都已经可以轻松应对了。
还有字符串分割等的问题,这次比赛第一题就是这个,但是学的还不是很明白,刷过一道题但是忘记了已经。
P2722 [USACO3.1]总分 Score Inflation - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
很显然这是一道完全背包的问题,在一维数组时,做起来与01背包唯一的不同点只是第二个for循环的枚举方向不一样,二维数组只有状态转移方程的第一个dp里的i不用去减一,仅此而已。这道题就是完全背包,将数据记录之后直接套上状态转移方程即可。解决背包问题的时候大多选用一维数组,二维数组虽然好理解,但是代码实现稍微比一维数组的复杂一点点。
P3078 [USACO13MAR]Poker Hands S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这道题思路很简单,将数据记录,中间无0的算一个整体,每个整体每次都减去该整体中数字最小的那一个,然后以0为分界线再将数据分成两个整体,继续重复步骤直到所有整体都只剩下一个数字,将这些单个的数字加到一起就可以解决这道题。代码实现也不难,运用递归,递归函数的形参设为左右两边界,每次减去最小的之后递归左右两边界,记录答案输出即可。
这道题还可以使用贪心,这是我想不到的,大佬们认为,这道题可以理解为连锁填坑,一个坑被填,与它相连的坑都会被填,所以,直接将第一个坑填满,答案加坑的深度,看第二个坑,第二个坑小于第一个坑深就直接跳过,因为填第一个的时候第二个就已经被填满了,如果大于第一个,加上两个坑的差值,这个坑还需要再被填几下,答案加上差值,以此类推到最后,输出答案。