洛谷官方題單 演算法1 4 遞推與遞迴

2021-10-19 10:50:14 字數 2343 閱讀 3173

1.p1255數樓梯

解題思路:斐波那契數列+高精度加法

一定要用高精度加法,否則只有50分左右

#include

using

namespace std;

int f[

5001][

5000]=

;//陣列開太大記憶體會爆掉

voidjf(

int k)

for(

int i=

0;i<=

4999

;i++)}

intmain()

//f[n]=f[n-1]+f[n-2]

for(

int i=

4999

;i>=

0;i--)if

(flag)}if

(flag==0)

return0;

}

2.p1002 [noip2002 普及組] 過河卒

解題思路:動態規劃+注意邊界

輸出有多少條路的題是典型的動態規劃題

#include

#include

using

namespace std;

int m[21]

[21]=

;long

long f[21]

[21]=

;struct node

;int p[2]

[8]=

,};int

main()

}if(m[0][

1]==0

)if(m[1][

0]==0

)//以上兩步為初始化步驟

for(

int i=

0;i<=b.x;i++

)//如果這個點不能走或者是已經初始化的點,不能進行更改

if(i-

1>=

0&& j-

1>=0)

else

if(i-

1>=

0&& j-

1<0)

else

if(i-

1<

0&& j-

1>=0)

}}cout << f[b.x]

[b.y]

;//輸出有多少條路

return0;

}

3.p1044 [noip2003 普及組] 棧

解題思路:轉換為卡特蘭數

對於序列裡的每乙個數都有可能是最後乙個出棧的,設這個數為x,對於小於x的x-1個數出棧順序有f[x-1]種,對於大於x的n-x-1個數出棧順序有f[n-x-1]種,則對於x可以組成的出棧序列有f[x-1]*f[n-x-1]種,遍歷x從1到n,就構成了卡特蘭數

#include

using

namespace std;

long

long f[19]

=,sum=0;

intmain()

} cout << f[n]

;return0;

}

4.p1028 [noip2001 普及組] 數的計算

解題思路:迴圈模擬遞迴

#include

using

namespace std;

int f[

1001];

intmain()

} cout << f[n]

;return0;

}

5.p1010 [noip1998 普及組] 冪次方

解題思路:遞迴

用於遞迴的函式每次輸入進去的是乙個需要轉換成二進位制表示的數,所以我們先將其轉換為二進位制,並且用乙個x[16]陣列儲存。

其次我們對二進位制的每一位進行輸出,首先需要肯定的是只有該二進位制位為1的時候才需要輸出,其次我們只直接輸出1,2,4的二進位制表示,其餘位需要進一步轉換,所以對於i!=0,1,2的位我們先用2將其包住,再進行遞迴。

需要注意的是,對於輸出的i不是最後乙個需要輸出的位時,我們要在他們後面加乙個+

#include

using

namespace std;

intsc

(int n)

i++;}

i--;while

(i>=0)

else

if(i==1)

else

if(i==2)

}else

if(i!=min)

} i--;}

}int

main()

未完待續…

洛谷官方dp題單

這題是一道很好的dp入門練手題 動 f x y max f x 1 y f x 1 y 1 a x y 首先,這題為什麼會想到記憶化?知道的人直接跳過 在dfs每種情況是,可能這個點之前已經搜過了,沒必要再去搜尋了,因此不如儲存記住,就沒必要再去dfs了。me的文章 一道裸的01揹包,特別簡單。不過...

洛谷題單 演算法1 7 搜尋

綠色為列標號,記 lie i 為列標記 紅色為主對角線標號,記 zhu i 為主對角線標記 藍色為次對角線標號,記 ci i 為次對角線標記 觀察 1,1 位置,它在 3 號主對角線上。向右移動到 1,2 位置,它就變為在 2 號主對角線上,可以確認 列標號與主對角線負相關 向下移動到 2,1 位置...

洛谷 1057 傳球遊戲(遞推與遞迴二分)

題目描述 上體育課的時候,小蠻的老師經常帶著同學們一起做遊戲。這次,老師帶著同學們一起做傳球遊戲。遊戲規則是這樣的 n個同學站成乙個圓圈,其中的乙個同學手裡拿著乙個球,當老師吹哨子時開始傳球,每個同學可以把球傳給自己左右的兩個同學中的乙個 左右任意 當老師在此吹哨子時,傳球停止,此時,拿著球沒有傳出...