題目詳情
對任何乙個自然數n,如果它是偶數,那麼把它砍掉一半;如果它是奇數,那麼把(3n+1)砍掉一半。這樣一直反覆砍下去,最後一定在某一步得到n=1。卡拉茲在2023年的世界數學家大會上公布了這個猜想,傳說當時耶魯大學師生齊動員,拼命想證明這個貌似很傻很天真的命題,結果鬧得學生們無心學業,一心只證(3n+1),以至於有人說這是乙個陰謀,卡拉茲是在蓄意延緩美國數學界教學與科研的進展……
我們今天的題目不是證明卡拉茲猜想,而是對給定的任一不超過1000的正整數n,簡單地數一下,需要多少步(砍幾下)才能得到n=1?
輸入格式:
多組資料,每行乙個整數0輸出格式:
每行乙個數,表示結果。
答題說明
輸入樣例13
輸出樣例:05
解析:這道題輸入應該會很多,這樣一來就會做很多重複工作.
例如計算7的時候:
若n為偶數,f(n)=f(n/2)+1;
若n為奇數,f(n)=f((n*3+1)/2)+1;
所以,要計算:7,11,17,26,13,20,10,5,8,4,2,1.
如果能夠記錄下來這些中間結果豈不甚好.所以自然而然想到動態規劃.動態規劃一言以蔽之:以強大的記憶力去彌補自己的笨蛋.
下面的**就是備忘錄方法,在求7時查一下庫存,如果庫存裡有f(7),直接取出來;如果沒有,那就遞迴的求一遍,在求的過程中作好記錄.
備忘錄方法與動態規劃思想一致,區別在於:
從方向和方法上來看,動態規劃是自下而上,遞推出頂層的結果來;備忘錄方法是自上而下,遞迴的推出結果來.
從效果來看,動態規劃求出了全部子問題,不留死角;備忘錄方法缺啥補啥,隨用隨造.
從效率來看,動態規劃不需遞迴,這樣快;備忘錄方法不用求出全部子問題,這樣也快.
從實現上來看,動態規劃=for+陣列直接訪問;備忘錄=遞迴+f函式檢視庫存.每次訪問庫存時,都要通過管理員f來訪問,這個過程中有乙個判斷庫存中是否已有此記錄.這是費時間的.
實際上,這是兩種處世心態:
動態規劃說:磨刀不誤砍柴工.
備忘錄說:書到用時不恨少,船到橋頭自然直,車到山前必有路.
備忘錄嘲笑動態規劃:你整那麼多都沒用,以後不一定會用到.
動態規劃道:有些時候這些全部有用,你就傻眼了.
動態規劃:地毯式轟炸,一次成功.
備忘錄:千里躍進大別山.神擋殺神,佛擋殺佛.
#include#includeint a[100001];
int f(int i)
if (i == 1)return 0;
if (a[i] == 0)
return a[i];
}void main()
備忘錄方法
動態規劃演算法的乙個變形是備忘錄方法。備忘錄方法也用乙個 來儲存已解決的子問題的答案,在下次需要解決此問題時,只要簡單地檢視該子問題的解答,而不必重新計算。與動態規劃演算法不同的是,備忘錄方法的遞迴方式是自頂向下的,而動態規劃演算法則是自底向上遞迴的。因此,備忘錄方法的控制結構與直接遞迴方法的控制結...
備忘錄方法
該法是動態規劃的變形,或者可以理解為動態規劃的優化,優化在增強理解和書寫簡單方面。public static int recurmatrixchain int i,int j 遞迴求解問題並先查表 public static int lookupchain int i,int j if m i j ...
XML DOm方法備忘錄
作 用 加上乙個節點當作指定節點最後的子節點。基本語法 說 明 newchild 是附加子節點的位址。範 例 docobj xmldoc.documentelement alert docobj.xml createattribute方法 作 用 建立乙個指定名稱的屬性。基本語法 xmldocume...