多米诺骨牌 - 竞争

时间:2011-04-18 13:26:10

标签: algorithm search tree

http://ecoocs.org/contests/ecoo_2007.pdf

我正在为我所在地区的å³å°†åˆ°æ¥çš„生æ€åŒºåŸŸå­¦ä¹ ï¼Œæˆ‘对这一个问题感到困惑。我真的ä¸çŸ¥é“从哪里开始。

它处于“区域â€â€œè¥¿éƒ¨å’Œä¸­éƒ¨â€éƒ¨åˆ†â€œé—®é¢˜3 - 多米诺链â€ã€‚

我一直在手动解决问题,我一直在考虑广度优先æœç´¢æˆ–深度优先æœç´¢ï¼Œä½†æ˜¯æœ‰ä¸¤é¢çš„多米诺骨牌正在严é‡æŠ›å¼ƒæˆ‘的想法。 有没有人有任何建议,或者æŸäº›èµ„æºå¯èƒ½ä¼šè®©æˆ‘æœç€æ­£ç¡®çš„æ–¹å‘å‰è¿›ï¼Ÿ

4 个答案:

答案 0 :(得分:4)

看起æ¥è¿™ä¸ªé—®é¢˜éœ€è¦ä¸€ç§é€’归的回溯方法。ä¿æŒä¸€ä¸ª7乘7的对称矩阵,显示哪些数字附加到哪个。例如,给定切片00 12 63 51,您将拥有以下矩阵:

  0 1 2 3 4 5 6 
  -------------
0|1 0 0 0 0 0 0
1|0 0 1 0 0 1 0
2|1 0 0 0 0 0 0
3|0 0 0 0 0 0 1
4|0 0 0 0 0 0 0
5|0 1 0 0 0 0 0
6|0 0 0 1 0 0 0

当您通过将图å—放置在潜在链中æ¥ä½¿ç”¨å›¾å—时,将其从矩阵中删除,并在通过回溯å–消图å—åŽå°†å…¶æ”¾å›žçŸ©é˜µä¸­ã€‚例如,如果链当å‰åŒ…å«51 12,则矩阵如下所示:

  0 1 2 3 4 5 6 
  -------------
0|1 0 0 0 0 0 0
1|0 0 0 0 0 0 0
2|0 0 0 0 0 0 0
3|0 0 0 0 0 0 1
4|0 0 0 0 0 0 0
5|0 0 0 0 0 0 0
6|0 0 0 1 0 0 0

鉴于链æ¡å½“å‰ä»¥2结尾,您å¯ä»¥æ²¿ç€ç¬¬2行查看å¯ä»¥è¿žæŽ¥çš„任何数字。找ä¸åˆ°ä»»ä½•å†…容,您å¯ä»¥å°†51 12标记为潜在的最长链,然åŽå›žæº¯åˆ°é“¾ä»…包å«51的状æ€ã€‚

维护一组你找到的所有最长链,并在æ’入之å‰æ£€æŸ¥æ–°é“¾ä¸­æ˜¯å¦å­˜åœ¨è‡ªèº«æˆ–å…¶å转。

如果您找到更长的链,请开始新的一组。一旦您对所有å¯èƒ½çš„链进行了详尽的æœç´¢ï¼Œæ‚¨çš„集åˆçš„大å°åº”该是长度最长的å˜ä½“数。

答案 1 :(得分:2)

就个人而言,在解决这些问题时,解决这些问题的一个好方法是在一个案例中完æˆå®ƒä»¬ï¼ˆè€ƒè™‘到以åŽä¼šå¢žåŠ å¤æ‚性)然åŽå¢žåŠ å¤æ‚性。这样你就ä¸ä¼šè¢«è¿™ç§é—®é¢˜çš„å¤æ‚性和几乎无穷无尽的“whatifsâ€æ‰€æ·¹æ²¡ã€‚

此外,在我å‚加的编程比赛中,60-70%的学分被授予了一个基本问题正确的解决方案,然åŽæœ€ç»ˆçš„百分比是你正确处ç†æŸäº›æ¡ˆä¾‹ã€‚我特æ„想到的情况是,我们é‡åˆ°äº†æ—…行推销员å˜ä½“的映射问题,如果他们æ供了带循环的图表,那么我的解决方案会无休止地循环,或者它会对此åšäº›ä»€ä¹ˆã€‚

因此,通过这ç§æ–¹æ³•ï¼Œæˆ‘è¦åšçš„是å°è¯•å°½å¯èƒ½ç›´æŽ¥åœ°è§£å†³é—®é¢˜ï¼šæŒ‰ç…§æ–‡æ¡£ä¸­çš„说明进行输入,然åŽç”¨ä½ æ‹¥æœ‰çš„部分生æˆæœ€é•¿çš„链。然åŽé€šè¿‡å…许旋转件等æ¥å¢žåŠ å¤æ‚性。

虽然这是解决问题的个人方法,但它在过去一直很好。我希望它也能为你æœåŠ¡ã€‚

答案 2 :(得分:2)

这是dynamic programming问题,因此您å¯ä»¥ä½¿ç”¨åŠ¨æ€ç¼–程技术解决它。

所以,如果我们有这些部分:

45 36 46 56

什么是å¯ä»¥ä»Ž4个骨骼中制作的最长链? 显然,最长的链å¯ä»¥ç”±3å—骨头和1å—骨头制æˆã€‚

什么是å¯ä»¥ä»Ž3个骨骼制作的最长链? 显然,最长链å¯ä»¥ç”±2å—骨头和1å—骨头制æˆã€‚

什么是å¯ä»¥ä»Ž2个骨骼制作的最长链? 显然,å¯ä»¥ç”±1个骨骼和1个骨骼组æˆçš„最长链æ¡ã€‚

什么是å¯ä»¥ä»Ž1个骨骼制作的最长链? 显然,1骨是最长的链。

我认为你看到这里的模å¼ï¼Œæˆ‘们需è¦ä½¿ç”¨é€’归。

所以如果我们有:

45 36 46 56

å‡è®¾æˆ‘们有一个函数longest_chain(set_of_pieces)。然åŽæˆ‘们需è¦æ£€æŸ¥ï¼š

longest_chain({36 46 56}) (+ 1 if we can append 45 or 54 else discard this chain)
longest_chain({45 46 56}) (+ 1 if we can append 36 or 63 else discard this chain)
longest_chain({45 36 56}) (+ 1 if we can append 46 or 64 else discard this chain)
longest_chain({45 36 46}) (+ 1 if we can append 56 or 65 else discard this chain)

什么是longest_chain({36 46 56})?

longest_chain({46 56}) (+ 1 if we can append 36 or 63 else discard this chain)
longest_chain({36 56}) (+ 1 if we can append 46 or 64 else discard this chain)
longest_chain({36 46}) (+ 1 if we can append 56 or 65 else discard this chain)

什么是longest_chain({46 56})?

longest_chain({46}) (+ 1 if we can append 56 or 65 else discard this chain)
longest_chain({56}) (+ 1 if we can append 46 or 64 else discard this chain)

什么是longest_chain({46})?两ç§å¯èƒ½æ€§ï¼š{46} {64}
我们å¯ä»¥åœ¨è¿™äº›ä¸­é™„加56或65å—?是的,我们å¯ä»¥åˆ¶ä½œæ­¤é“¾{46, 65},然åŽæˆ‘们放弃{64} 对longest_chain({56})执行相åŒæ“作,我们得到:{56, 64}。

因此,我们现在知é“longest_chain({46 56})是{46, 65}, {56, 64}

继续这样åšç›´åˆ°å¾—到所有答案。

希望这有帮助。

答案 3 :(得分:0)

以下是我的开始。

标记n多米诺骨牌D1..Dn。

让Cmæˆä¸ºä½¿ç”¨domines D1..Dm(和C0 = {})å­é›†å½¢æˆçš„链的集åˆã€‚

Cm+1是通过å°è¯•å°†Dm + 1æ’å…¥Cm中链中所有å¯èƒ½ä½ç½®ï¼ŒåŠ ä¸Šä½¿ç”¨Dm+1æ¥å°½å¯èƒ½åœ°è¿žæŽ¥æ¥è‡ª{{1}çš„ä¸ç›¸äº¤é“¾çš„对æ¥å½¢æˆçš„},加上由Cm组æˆçš„å•è¡Œé“¾ã€‚

ä½ å¯ä»¥åšä¸€äº›ä¼˜åŒ–(例如,订购多米诺骨牌),但我会倾å‘于在å˜å¾—过于èªæ˜Žä¹‹å‰å°è¯•è¿™æ ·åšã€‚