遞迴與遞推小結

2021-10-08 14:09:02 字數 3750 閱讀 6226

時間限制: 1 sec 記憶體限制: 64 mb

題目描述

九連環是由九個彼此套接的圓環和一根橫桿組成,九個環從左到右依次為l~9,每個環有兩種狀 態:1和0,1表示環在杆上,0表示環不在杆上。初始狀態是九個環都在杆上,即:111111111,目標狀態是九個環都不在杆上,即:000000000,由初始狀態到目標狀態的變化規則是:

(1)第一環為無論何時均可自由上下橫行;

(2)第二隻環只有在第一環為1時,才能自由上下;

(3)想要改變第n(n>2)個環的狀態,需要先使第一到第(n-2)環均為下桿,且第n-1個環為上杆,而與第n+l個到第九環狀態無關;

(4)每改變乙個環,記為一步。

現在九連環由111111111變到000000000,求中間第i步的狀態。

輸入僅包含乙個整數i。

輸出僅包含中間第i步的狀態。如果輸入的步數大於實際變換所需的步數,則輸出-1。

樣例輸入

【樣例1】

2【樣例2】

500樣例輸出

【樣例1】

010111111

【樣例2】

-1腦子不夠。。

題目大意:

給你步數,讓你解九連環,看能解到什麼狀態,其中1實在九連環上,0是不在。

解題思路:

九連環的解法是,要解下第n個,就要n-2及其之前的都必須解下來,n-1在上面,這樣才能解下第n個,同時剩下n-1個在上面。特別的,第乙個可以自由上下。所以,就是很明顯的遞迴。

遞迴函式:

引數——ring的編號。

終止條件:步數為0的時候。

遞迴過程,首先要判斷第n-1個是否在上面,如果不在就要讓他在上去;

然後遍歷n-2之前的是否在上面,如果在,就讓他們下來。

note:**裡0是沒有解下來,1是已經解下來。

#include

#include

#include

#include

//#define local

using

namespace std;

typedef

unsigned

long

long ull;

typedef

long

long ll;

const

int n =

2e4+5;

const

int inf =

0x3f3f3f3f

;const

int mod =

998244353

;int n;

int ring[10]

;void

dfs(

int m)

intmain()

return0;

}

時間限制: 1 sec 記憶體限制: 64 mb

題目描述

任何乙個正整數都可以用2的冪次方表示。例如:

137 =2

7+23

+2

0137=2^7+2^3+2^0

137=27

+23+

20同時約定方次用括號來表示,即a

ba^b

ab可表示為a(b

)a(b)

a(b)

。由此可知,137

13713

7可表示為:

2 (7

)+2(

3)+2

(0

)2(7)+2(3)+2(0)

2(7)+2

(3)+

2(0)

進一步:7=2

2+2+

20(2

1用2表

示)3=

2+20

7=2^2+2+2^0 (2^1用2表示) 3=2+2^0

7=22+2

+20(

21用2

表示)3

=2+2

0所以最後137

13713

7可表示為:

2 (2

(2)+

2+2(

0))+

2(2+

2(0)

)+2(

0)

2(2(2)+2+2(0))+2(2+2(0))+2(0)

2(2(2)

+2+2

(0))

+2(2

+2(0

))+2

(0)又如:

1315=2

10+2

8+25

+2+2

01315=2^10 +2^8 +2^5 +2+2^0

1315=2

10+2

8+25

+2+2

0所以1315

1315

1315

最後可表示為:

2 (2

(2+2

(0))

+2)+

2(2(

2+2(

0)))

+2(2

(2)+

2(0)

)+2+

2(0)

2(2(2+2(0))+2)+2(2(2+2(0)))+2(2(2)+2(0))+2+2(0)

2(2(2+

2(0)

)+2)

+2(2

(2+2

(0))

)+2(

2(2)

+2(0

))+2

+2(0

) 輸入一行,乙個正整數(n≤20000)

輸出符合約定的n的0,2表示(在表示中不能有空格)

樣例輸入

137樣例輸出

2(2(2)+2+2(0))+2(2+2(0))+2(0)

解題思路:

①看見別人有暴力打表解決問題的;

②遞迴的思路:

明確目的:求n的二次冪表示的各個指數,順序是從高到低,之後將各個指數再進行「拆分操作」。

遞迴函式:

引數:當前的n值和遞迴的深度(2的指數)。

終止條件:n==1的時候

函式print(n,0)就是求n的「2的冪次方」表示,所以,遞迴呼叫print(n,0)就可以解決問題。(當然,當n<=2的時候,直接按格式輸出就可以。)

#include

#include

#include

#include

//#define local

using

namespace std;

typedef

unsigned

long

long ull;

typedef

long

long ll;

const

int n =

1e4+5;

const

int inf =

0x3f3f3f3f

;const

int mod =

998244353

;int n;

void

print

(int n,

int deep)

if(deep==1)

if(deep==2)

if(deep>2)

}else}}

}int

main()

遞推與遞迴

遞推與遞迴 遞推像是多公尺諾骨牌,遞迴是大事化小。遞推的效率更高 遞推 斐波那契數列 例 母親為兒子的四年大學學費準備了一筆存款,兒子每月月底取下月生活費1000元。銀行年利率為 1.71 畢業時連本帶息要取出 1000 元。則要存入多少錢。include define rate 0.0171 in...

遞推與遞迴

遞迴 將問題規模為n的問題,降解成若干個規模為n 1的問題,依次降解,直到問題規模可求,求出低階規模的解,代入高階問題中,直至求出規模為n的問題的解。遞推 構造低階的規模 如規模為i,一般i 0 的問題,並求出解,推導出問題規模為i 1的問題以及解,依次推到規模為n的問題。遞迴包括回溯和遞推兩個過程...

遞迴與遞推

1 遞迴與遞推的定義 前者是 後者是對以前的問題進行計算,以得出當前問題的大結果。2 它們的典例和運用遞迴 遞推dfs,搜尋與回溯 動態規劃 用遞推能做的,記憶化搜尋定能夠實現 遞推僅能求方案數,求具體方案需用遞迴 3 各種關於遞推的例題 爬樓梯 數樓梯 兔子問題 includeusing name...