首先是遞推,洛谷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 ...