对于在分隔符(例如<和>)之间匹配文本的常见问题,有两种常见的模式:
*或+量词START [^END]* END,例如<[^>]*>,或*?或+?量词START .*? END,例如<.*?>.是否有一个特别的理由支持一个而不是另一个?
我正在阅读关于"贪婪"算法的教程,但我很难发现它们解决了真正的"顶级编码器"问题.
如果我知道某个问题可以通过"贪婪"算法解决,那么对解决方案进行编码就非常容易了.但是,如果我没有被告知这个问题是"贪婪的"我无法发现它.
使用"贪婪"算法解决问题的常见属性和模式是什么?我可以将它们减少到已知的"贪婪"问题之一(例如MST)吗?
例如:数组:4,3,0,1,5 {假设所有数字> = 0.数组中的每个元素也对应一个数字.即数组中的每个元素都在0到9之间.}
在上面的数组中,最大的数字是:5430 {使用数组中的数字5,4,3和0}
我的方法:
对于3的可分性,我们需要数字的总和可以被3整除.所以,
因此,主要步骤是STEP-3,即如何找到子集,使其包含MAXIMUM可能数量的元素,使得它们的和为MAX,并且可以被3整除.
我在想,也许Step-3可以通过GREEDY CHOICE来完成所有元素并继续删除集合中的最小元素,直到总和可以被3整除.
但我不相信这个贪婪的选择会起作用.
请告诉我的方法是否正确.如果是,那么请建议如何做第3步?
此外,请建议任何其他可能/有效的算法.
在(正)整数的非递减序列中,当可以去除两个元素时
.从这个序列中最多可以删除多少对?
所以我想到了以下解决方案:
例:
count:= 0
[1,5,8,10,12,13,15,24] - > 第一名:= [1,5,8,10],第二名:= [12,13,15,24]
2*1?<12 - > true,count ++,it_first ++和it_second ++
2*5?<13 - > true,count ++,it_first ++和it_second ++
2*8?<15 - > false,it_second ++
8?<24 - > true,count ++ it_second到达最后一个元素 - END.
count == 3
线性复杂度(最坏的情况是没有这样的元素被删除.n/2个元素与n/2个元素相比).所以我缺少的部分是算法的"正确性" - 我已经阅读了贪婪算法证明 - 但主要是树木,我找不到类比.任何帮助,将不胜感激.谢谢!
编辑: 正确性我的意思是:*它的工作原理*它不能更快地完成(在logn或常量)
我想放一些图形,但由于声誉点<10 - 我不能. …
这是一个基于俄罗斯方块的谜题.在这个谜题中,我们将获得接下来将从顶部落下的n个片段的序列.我们的工作是在GameOver之前最大化得分.一般的俄罗斯方块没有多项式时间算法,但在这个难题中只允许I(直)四联体.虽然它不允许旋转它们.
所以这里是约束:
找到可以获得的最高分数.
例:
8 x 6板.接下来的7个tetrominoes是[——,|,|,——,|,——,|]其中'——'表示水平我四氨基和|表示垂直我四氨基.
在这种情况下,最大可能得分是3使用以下策略('.'代表空板,'#'代表四氨基片的一部分).
Initially:
........
........
........
........
........
........
1st move:
........
........
........
........
........
####....
2nd Move:
........
........
.......#
.......#
.......#
####...#
3rd Move:
........
........
......##
......##
......##
####..##
4th Move:
........
........
......##
......##
####..##
####..##
5th Move:
........
........
.....###
.....###
####.###
####.###
6th Move:
........
........
.....### …Run Code Online (Sandbox Code Playgroud) 好的,我有一个问题.我有一套各种尺寸的瓶装"A",里面装满了水.然后我又拿了另一套各种尺寸的瓶子"B",都是空的.
我想将水从A转移到B,知道每组的总容量是相同的.(即:组A含有与组B相同的水量).
这当然是微不足道的,只需拿B中的第一个瓶子,倒入A中的第一个瓶子直到它满了.然后,如果B中的瓶子中还有水,请继续使用A中的第二个瓶子等.
但是,我想尽量减少浇注总量(从瓶子倒入另一个瓶子的动作,每个动作计数1,与其涉及的水量无关)
我想找到一个贪婪的算法来做到这一点,或者如果不可能,至少是一个有效的算法.然而,效率是算法正确性的次要因素(我不想要一个次优的解决方案).
当然,这个问题只是计算机程序中管理个人开支的真正问题的隐喻.
我认为默认情况下我的正则表达式会展示我想要的贪婪行为,但它不在以下代码中:
Regex keywords = new Regex(@"in|int|into|internal|interface");
var targets = keywords.ToString().Split('|');
foreach (string t in targets)
{
Match match = keywords.Match(t);
Console.WriteLine("Matched {0,-9} with {1}", t, match.Value);
}
Run Code Online (Sandbox Code Playgroud)
输出:
Matched in with in
Matched int with in
Matched into with in
Matched internal with in
Matched interface with in
Run Code Online (Sandbox Code Playgroud)
现在我意识到,如果我只是按照长度降序对关键字进行排序,我可以让它为这个小例子工作
所以我的问题是:为什么这是懒惰的,我该如何解决?
我有一个算法的问题.
给出n个盒子,每个盒子具有固定的重量和强度(均以kg给出).Box的力量告诉我们它能承受的最大重量是多少.我们必须形成最高堆的给定盒子(每个盒子具有相同的高度).您应该提出一种始终给出最优解的算法,这是k盒的最长序列(k <= n).
嗯,这是我已经想到的解决方案:
看起来这个算法工作得很好,但我不确定它是否总是给出最优解 - 可能它没有.我一直在想动态解决方案,类似于背包问题的解决方案,但我不确定它是否可以通过这种方式解决.对于我的问题,似乎没有最佳的子结构.
预先感谢您的任何帮助.:)
greedy ×10
algorithm ×8
regex ×2
regex-greedy ×2
alternation ×1
dijkstra ×1
dynamic ×1
non-greedy ×1
puzzle ×1
tetris ×1