藍橋杯備戰 遞推 遞迴 字首和 差分

2021-10-08 04:09:07 字數 2101 閱讀 7869

首先是遞推,洛谷p1255 數樓梯。

階梯思路如圖:

但是由於該題n最大能到5000,顯然,數值過大會爆掉long long,因此我們需要自己定義個陣列自己模擬加法運算,被稱為高精度運算。

這裡先上**,然後上模擬這個運算過程的圖。

#include

#include

#include

#include

using

namespace std;

//台階最大數為5000,我們定義個5005

const

int step_max=

5005

;//定義乙個二維陣列作為**。tab[n]表示上第n個台階的方式數量

int tab[step_max]

[step_max]

;//len表示當前方法數的位數

int len=1;

void

jump

(int k)

//進製

當求和後超過10時進製,將其十位給右面的元素,個位賦值給自己,進製的同時讓len++,表示目前有2位數。

這題解決了,來看遞迴的題。

計蒜客t2116 選數

從n個數字中任選k個數字求和,和為素數的情況有多少種?

我的寫法是遞迴,函式中不加入元素呼叫一次,加入元素呼叫一次,想想相當於乙個指數級的遞迴,雖然ac了,總感覺**不得勁。

#include

using

namespace std;

vector <

int> chosen,all;

int n,k,cnt=0;

int sum=0;

int prime[

20000005];

int countd=0;

void

cal(

int x)

if(flag)

sum=0;

return;}

cal(x+1)

; chosen.

push_back

(all[x]);

cal(x+1)

; chosen.

pop_back()

;}intmain()

if(flag)cnt++;}

cout<

return0;

}for

(int i=

1;i<=n;i++

)cal(0

);cout<

//cout<

}

校隊的標程是這樣的:

#include

using

namespace std;

int n,k,ans,a[30]

;bool

isprime

(int sum)

return

true;}

void

dfs(

int m,

int sum,

int st)

for(

int i=st;i<=n;i++

)dfs

(m+1

,sum+a[i]

,i+1);

}int

main()

藍橋杯備戰 遞迴篇

持續更新 二 李白喝酒 三 六角填數 小明剛剛看完電影 第39級台階 離開電影院的時候,他數了數禮堂前的台階數,恰好是39級 站在台階前,他突然又想著乙個問題 如果我每一步只能邁上1個或2個台階。先邁左腳,然後左右交替,最後一步是邁右腳,也就是說一共要走偶數步。那麼,上完39級台階,有多少種不同的上...

字首和 差分

數列的字首和 sum i 表示a 1 a i 的和 用處1 求i j的和sum j sum i 1 用處2 區間修改。設定乙個change陣列。當區間 i,j 上要加k時,我們令change i k,令change j 1 k。如果我們對change陣列求字首和的話,字首和sum change i ...

字首和 差分

有n個數和q次操作,每一次操作指明了要操作的區間 l,r 以及讓該區間內的所有元素全部加c 輸出q次操作後所有元素的大小 第一行 n q 1 n,q 2 105 第二行 n個數 a1,a2 an 106 ai 106 接下來q 行 每行3個數 l r c 表示 l,r 區間內每個數加c 1 l r ...