自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(12)
  • 收藏
  • 关注

原创 动态规划思想-划分数问题

对于i<j的情况,那么考虑将j正好划分为i份,由于j比i大,所以i份的划分中,每一个划分至少是一,所以我们一定有一个基础划分也就是1,1,1,1,1...1。再将剩余的数字j-i分配到这i个”份“上,我们就得到了将j正好划分为i份的结果。对于i==j的情况,那么将j正好划分为i份就只对应一种情况也就是全一。对于i>j的情况,将j强行分为i份是不可能的,至少i==j时才有得分。首先dp[i][j]代表的是将j划分i,i-1,i-2...1份所对应的总共的划分数量。划分出来的数不能为零,划分数量不能为零。

2024-02-07 18:35:09 379 1

原创 动态规划思想-最长上升子序列(详细)

所以,我们始终要找出来dp数组中第一个比a[i]大的数然后替换,因为前面的数是有序的,所以我们应用二分查找的效率比较高。dp[i]不仅要保证其中存的是长度是i+1的上升序列中的最后一个值,并且要保证这个值是所有可能值的最小值。如果第二个数的比第一个数小,他将代替第一个数成为目前最小的长度为1的子序列的最后一个数。第一,这个数比前面的所有结尾数都大,那么将这个数作为一个全新的最长的子序列的最后一个数。我们从前到后遍历这个序列,不停的寻找长度为1,2,3...的上升子序列的最后一个数。

2024-02-06 18:29:30 453 1

原创 动态规划思想-完全背包问题

有num种重量和价值分别为weight[i] 和 value[i]的物品,和一个容量为capacity的背包。我们不妨定义二维状态数组dp[i][j],i 代表的是前 i 件物品,j 代表的是背包的容量。dp[i][j]代表的就是:前 i 件物品在总重量不超过 j 的情况下,所能够达到的最大价值。物品数量num,物品的重量weight和价值value,背包的容量capacity。所以本题的题解本质上就是求dp[num][capacity]的值。其实,完全背包和01背包的区别就在于某个物品可以选择多次。

2024-01-30 22:24:25 225 1

原创 动态规划思想-01背包问题的三种DP方法

如果我们充分利用构造的dp数组的话,我们姐可以不需要递归。我们只需要利用数组中的已知值,充分填充数组中的每一种可能值,就能计算出数组中所有情况的可能值,这样我们直接使用数组中的值就可以了,不需要递归。在我们使用第一中方法递归时,我们会经常遇到重复递归的情况。但是如果我们每一次运算之后都将这一种状态记录下来,在下一次遇到这种情况时我们就可以直接使用,而不用重复递归。遍历每一种可能的情况,从第一件物品开始判断装或者不装,返回装第一件物品和不装第一件物品当中的较大值。物品个数,每个物品的价值和重量,背包容量。

2024-01-28 17:28:21 195

原创 POJ3253-Fence_Repair

2. 对于这些两两合并的数来说,最后产生的树的非叶子节点的值的和就是这颗霍夫曼树的带权路径长度和,也就是我们需要的消耗的钱财的总量。所以,将每一次合并的两个值累加得到的就是总钱数。这个题实例代码并未用使用具体的树形数据结构,只是使用了其思想,时间复杂度仍然是O(N^2)。根据霍夫曼树的合并规则,我们每次需要挑选最小的两个数合并,并且将这两个数的和再加入其中进行下一次的比较。1. 这个题本质上时问:给定一定数量的数,将这些数以最小的消耗合并起来,每合并一次就消耗合并的两个数的值之和这么多钱。

2024-01-26 11:51:15 583 1

原创 POJ3069-Saruman‘s_Army

2. 我们要做的是,先以第一点为基准点(next),向后寻找能够被覆盖的最远点,将其设置为标记点(pointed)。为了“充分利用”这个标记点,我们继续向后寻找,找到那个在覆盖范围之外的最左侧的点,并且以这个点为基准(next),继续寻找下一个pointed点。1. 要想用最少的标记点去覆盖所有的点,那么我们就要使用贪心算法的思想。也就是说,要让一个标记点能够覆盖尽可能多的点。3. 所以,在一次循环中,我们需要找到next和pointed两个点,并且保证next不能越界。

2024-01-25 23:52:18 270

原创 POJ3617-Cow_Line

2. 如果首字母和末字母的字典序是一样的,那么我们同时移动两个两个比较的字母,比较第二个和倒数第二个字母的字典序。以此类推,直到两边比较出来字典序的大小,然后把字典序小的那一边的头或者尾字母打印出来(可以理解为,我们想让小字典序的字母尽快暴露出来,所以在头和尾相同的情况下,拿走了更靠近小字典序的那个字母)。这一步同样可以理解为将原字符串与完全逆序字符串的字典序作比较,将较小字典序的头字母取出来打印,效果是一样的(因为字典序的比较始终是自头向尾的)。

2024-01-25 00:17:09 800

原创 贪心算法思想-区间问题

这个问题,如果我们在构造transac二元组时,将结束时间放到first,用sort()函数进行字典序排序,那么就会为我们呈现出来优先按照结束时间排序的transac序列。为了进行这两个条件的判断,我们只需要维护preEnd(前一次工作的结束时间)和minEnd(目前要进行工作的最早结束时间)两个变量就能够达到效果。注意:完成一个工作的过程中不能做其他的工作,也就是说下一个工作只能等待这个工作结束之后才能进行。条件一:下一个工作的结束时间是满足条件的工作中结束时间最早的。第三行是每一项工作的结束时间。

2024-01-24 22:58:59 306

原创 DSF思想-部分和问题

1. 构建状态树:我们从第一个数开始规划出所有的可能性,也就是算上第一个数和不算第一个数两种情况。那么接着向下分支,对于第二个数,第一个数的每一种情况又能对应第二个数的两种情况,所以总共是2的2次方也就是4种情况。以此类推,接着判断第三个数,第四个数...。这是递归的过程,递归终点是关于某个数是否加进去的讨论,遍历到了最后一个数,也就是遍历到了树的最底层,这时候只需要返回sum值和目标值相等与否就可以了。这个树的每个节点都对应一种状态,即 int(加到了第几个数)和 int(前面所有数的和)。

2024-01-23 23:31:13 374 1

原创 BFS思想-迷宫最短路径

1. bfs的思想,是借助队列来依次完成第一层,第二层,第三层...的搜索。由于我们这里要求的最短路径是起始点到终点,所以从起始点出发使用bfs搜索,搜索到的每个点都是起始点到这个点的最短路(因为每次都只能走一步,而bfs也只是遍历上下左右的四个点,所以没有比bfs更短的路径走法)。2. 这里,在迷宫中行走,只能朝向上,向下,向左,向右四个方向行走。所以,为了方便,我们将(0,1)(0,-1)(1,0)(-1,0)这四中走法用两个数组保存起来,遍历的时候只需要通过一层循环就能达到走四个方向的效果。

2024-01-23 22:42:06 367

原创 POJ2386-Lake_Counting

2. 由于题目要求的是八面相通即算一个水洼,所以dfs的范围应该是以某点为中心的八个点,所以在遍历的时候,可以采用辅助的int来遍历,即tx和ty。1. 在这个问题中,对某一个坐标的dfs,要求将这个坐标能够dfs遍历到的所有点都标记为" . ",这是因为要避免重复的计算,最后field中留下的w个数,即为水洼个数。最后统计遇到水洼的次数,即总共的水洼个数。3. dfs的思想在此题中体现为:沿中心点的八面点进行深搜,已知遍历到最远,也就是将属于这片水洼的w遍历完全并且全部修改为“ . ”。

2024-01-22 22:27:35 329

原创 POJ1852-Ants

首先考虑,所有的蚂蚁速度都相同,所以当两个蚂蚁相撞从而相反运动时,实际上(从用时上)等于两个蚂蚁互不相认,继续前进的情况。Attention: 本题要求求解的是’所有‘蚂蚁都落下绳子的最短时间,所以要分别取两种情况的最大值。所有的蚂蚁都朝向离自己最短的那一端前进。这样不会造成任何的碰撞,并且也不会有·比这样时间更短的情况。只要想明白这个问题,那么最长时间就是每个蚂蚁都向离自己远的一端前进,直到掉落。

2024-01-22 20:35:29 383

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除