周長最長;及找到最大數分析

紫鳳發表於2013-08-13

今日面試題:周長最長

n根長度不一的棍子,判斷是否有三根棍子可以構成三角形,並且找到周長最長的三角形。

=======================================

找到最大數分析

原題

請構造程式,找到滿足如下條件的最大數:

假設最大數表示為,abcdefghihk..... 每一個字母表示一位,其中abc,bcd,cde...以此類推,每三個一組,構成的數字是素數,也就是說abc, bcd, cde,等,都是素數,而且這些素數是互不相同的。

分析

首先,這個最大的數存在麼?一定存在的。因為,abc、bcd、cde等都是不同的素數。並不會出現環。總會結束。

其次,面試題做得多了,要能夠令靈活運用。並不是一定要有多麼巧妙的方法,當然,一個大家都會追求一個巧妙的思路。但不好覺得暴力的方法,在任何條件下,都是拒之千里的。這個題目首先想到暴力解決,是沒有問題的。三位的素數是有限的。這是可以暴力的基礎。

那麼,出了暴力之外,還可以如何改進呢?我們首先對這個題目進行建模,構造一個有向圖G。G中的節點就是三位素數,比如abc,bcd,def都是三位素數,則他們都是有向圖G中的節點。其中,abc和bcd之間有abc指向bcd的邊。abc、bcd則與def之間沒有邊。如此,構造完整G。大家可以在紙上畫一畫。所有的三位素數如下:

101, 103, 107, 109, 113,

127, 131, 137, 139, 149, 151, 157, 163, 167, 173,

179, 181, 191, 193, 197, 199, 211, 223, 227, 229,

233, 239, 241, 251, 257, 263, 269, 271, 277, 281,

283, 293, 307, 311, 313, 317, 331, 337, 347, 349,

353, 359, 367, 373, 379, 383, 389, 397, 401, 409,

419, 421, 431, 433, 439, 443, 449, 457, 461, 463,

467, 479, 487, 491, 499, 503, 509, 521, 523, 541,

547, 557, 563, 569, 571, 577, 587, 593, 599, 601,

607, 613, 617, 619, 631, 641, 643, 647, 653, 659,

661, 673, 677, 683, 691, 701, 709, 719, 727, 733,

739, 743, 751, 757, 761, 769, 773, 787, 797, 809,

811, 821, 823, 827, 829, 839, 853, 857, 859, 863,

877, 881, 883, 887, 907, 911, 919, 929, 937, 941,

947, 953, 967, 971, 977, 983, 991, 997

有向圖G構造完畢之後,該如何找到最大的數呢?其實就是找到G中,最長的路徑。可以採用動態規劃來解決。dp[i]表示,到節點i為止的最長路徑。狀態轉移方程可以表示為:

dp[i] = max(dp[j] + 1), 其中, 節點j是有邊指向i的所有節點。

在實現過程中,要注意儲存路徑,這樣才能得到最大數。例如,得到最大的j為j1,則 儲存prev[i] = j1。

通過計算,最終得到最大數為:

9419919379773971911373313179

【分析完畢】

本文來自微信:待字閨中,2013-08-11釋出,原創@陳利人 ,歡迎大家繼續關注微信公眾賬號“待字閨中”。

相關文章