递 归 ,递 推 ,贪 心,学 习 总 结
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??目? ? ? ? ? ? ? ? ? ? ? ?錄
壹 :遞 歸
一 . 遞 歸 初 步( 理 論 )
二 . 遞 歸 深 入( 習 題 )
貳 :遞 推
一? .? 遞? 推? 初? 步 ( 理 論 )
二 . 遞 推 深 入 ( 習 題 )
叁 : 貪 心
一? .? 貪 心? 初? 步 ( 理 論 )
?二 . 貪 心?深 入 ( 習 題 )
??
壹 :遞 歸
一 . 遞 歸 初 步( 理 論 )
?是指函數/過程/子程序在運行過程序中直接或間接調用自身而產生的重入現象。在函數中函數不斷引用自身,直到引用的對象已知。使用遞歸解決問題,思路清晰,代碼少。但是在主流高級語言中使用遞歸算法要耗用更多的棧空間,所以在堆棧尺寸受限制時,應避免采用。所有的遞歸算法都可以改寫成與之等價的非遞歸算法。
遞歸函數基本寫法
/*題目:算出從1到n之間所有數的和 */ #include<bits/stdc++.h> using namespace std; int n,sum=0; //sum用來求和 int fun(int num,int i) { //i表示下表if(i<=num) {sum+=i;fun(num,i+1);}else {return 0;} } int main() {cin>>n;fun(n,0);cout<<sum;return 0; }這樣就完成了 一個遞歸的過稱
二 . 遞 歸 深 入( 習 題 )
1148 - 【入門】數數小木塊-東方博宜OJhttps://oj.czos.cn/p/1148
思 路 :函 數 內 算 出 每 一 層 積 木 的 塊 數
? ? ? ? ? ? ?再 在 主 函 數 內 依 層 求 和?
題 解 :
#include<bits/stdc++.h> using namespace std; int num(int c) {int r;if(c==1) {r=1;}else{r=num(c-1)+c;} return r; } int main() {int n,res=0;cin>>n;while(n){res=res+num(n);n--;}cout<<res;return 0; }1238 - 【入門】統計每個月兔子的總數-東方博宜OJhttps://oj.czos.cn/p/1238
思 路 :(這 題 使 用 遞 歸 會 超 時)
???????????????使 用 普 通 遞 歸?與 數 組 結 合 防 止 超 時
代 碼:
#include<bits/stdc++.h> using namespace std; int main() {long long a[60],x;cin>>x;a[1]=1;a[2]=1;for(int i=3;i<=x;i++){a[i]=a[i-1]+a[i-2];}cout<<a[x];return 0; }1223 - 【入門】漢諾塔的移動次數-東方博宜OJhttps://oj.czos.cn/p/1223
思 路 :這 題 重 點 是 找 到 規 律
? ? ? ? ? ? ?然 后 在 進 行 遞 歸 求 解
代 碼 :
#include<bits/stdc++.h> using namespace std; int fun(int n) {int r=0;if(n==1){return 1;}else{return fun(n-1)*2+1;} } int main() {int n;cin>>n;cout<<fun(n); return 0; }貳 :遞 推
一? .? 遞? 推? 初? 步 ( 理 論 )
遞推是按照一定的規律來計算序列中的每個項,通常是通過計算前面的一些項來得出序列中的指定項的值。其思想是把一個復雜的龐大的計算過程轉化為簡單過程的多次重復,該算法利用了計算機速度快和不知疲倦的機器特點。
遞 推 的 基 本 寫 法
/*https://oj.czos.cn/p/1238 */ #include<bits/stdc++.h> using namespace std; int main() {long long a[60],x;cin>>x;a[1]=1;a[2]=1;for(int i=3;i<=x;i++){a[i]=a[i-1]+a[i-2];}cout<<a[x];return 0; }二 . 遞 推 深 入 ( 習 題 )
1298 - 【基礎】摘花生問題-東方博宜OJhttps://oj.czos.cn/p/1298
思 路 :找 到 摘 花 生 的 最 好 的 路 線
? ? ? ? ? ? ?利 用 遞 推 的 思 想 進 行 求 解
代 碼 :
#include<bits/stdc++.h> using namespace std; int main() {int x,y;cin>>x>>y;int a[x+2][y+2];for(int i=1;i<=x;i++){for(int j=1;j<=y;j++){cin>>a[i][j];}}for(int i=2;i<=x;i++){a[1][i]+=a[1][i-1];}for(int i=2;i<=x;i++){a[i][1]+=a[i-1][1];}for(int i=2;i<=x;i++){for(int j=2;j<=y;j++){if(a[i][j-1]>a[i-1][j]){a[i][j]+=a[i][j-1];}else if(a[i][j-1]>a[i-1][j]){a[i][j]+=a[i-1][j];}else{a[i][j]+=a[i-1][j];}}}cout<<a[x][y];return 0; }1374 - 【基礎】摘花生問題(2)-東方博宜OJhttps://oj.czos.cn/p/1374
思 路 :在 上 題 的 基 礎 上
? ? ? ? ? ? ?進 行 改 良 輸 出 路 線 即 可?
代 碼 :
#include<bits/stdc++.h> using namespace std;int main() {int a[110][110],t[110][110],b[110];int x,y;cin>>x>>y;for(int i=1;i<=x;i++){for(int j=1;j<=y;j++){cin>>a[i][j];t[i][j]=a[i][j];}}for(int i=2;i<=x;i++){a[1][i]+=a[1][i-1];}for(int i=2;i<=x;i++){a[i][1]+=a[i-1][1];}for(int i=2;i<=x;i++){for(int j=2;j<=y;j++){if(a[i][j-1]>a[i-1][j]){a[i][j]+=a[i][j-1];}else if(a[i][j-1]>a[i-1][j]){a[i][j]+=a[i-1][j];}else{a[i][j]+=a[i-1][j];}}}int k=2,i=x,j=y;b[1]=t[x][y];while(1){if(i==0&&j!=0){b[k]=t[i][j];j--;k++;}else if(j==0&&i!=0){b[k]=t[i][j];i--;k++;}else if(i!=0&&j!=0){if(a[i][j-1]>a[i-1][j]){b[k]=t[i][j-1]; j--;k++;}else {b[k]=t[i-1][j];i--;k++;}}else{break;}}for(int j=k;j>=1;j--){if(b[j]!=0){if(j!=1) cout<<b[j]<<"-";else cout<<b[j];}}return 0; }叁 : 貪 心
一? .? 貪 心? 初? 步 ( 理 論 )
貪心法是從問題的某個初始解出發,采用逐步構造最優解的方法,向給定的目標前進。在每一個局部階段,都做一個“看上去”最優的決策,并期望通過每一次所做的局部最優選擇產生出一個全局最優解。做出貪心決策的依據稱為“貪心策略”。要注意的是,貪心策略一旦做出,就不可再更改。與遞推不同的是,貪心嚴格意義上說只是一種策略或方法,而不是算法。推進的每一步不是依據某一個固定的遞推式,而是做一個當時“看似最佳”的貪心選擇(操作),不斷將問題歸納為更小的相似子問題。所以,歸納、分析、選擇正確合適的貪心策略,是解決貪心問題的關鍵。對于一個問題,如果想用貪心法求解,首先要想到基于某種“序”或者“規則”的貪心策略。?其次還要能證明其正確性。
貪 心 的 基 本 寫 法
/*https://oj.czos.cn/p/1229 */ #include<bits/stdc++.h> using namespace std; int a[1010],n,x,p,k,j; int main() {cin>>n;for(int i=1;i<=n;i++){cin>>x; p=-1;for(int j=1;j<=k;j++){if(a[j]>=x){p=j;break; }}if(p==-1){k++;a[k]=x;}else{a[p]=x;}}cout<<k;return 0; }?二 . 貪 心?深 入 ( 習 題 )
1372 - 【基礎】活動選擇-東方博宜OJhttps://oj.czos.cn/p/1372
思 路 :找 到 貪 心 策 略?
? ? ? ? ? ? ?從 而 進 行 求 解?
代 碼 :
#include<bits/stdc++.h> using namespace std; int b[110],e[110]; int n,c; int main() { cin>>n;for(int i=1;i<=n;i++){cin>>b[i]>>e[i]; }for(int i=1;i<=n-1;i++){for(int j=1;j<=n-1;j++){if(e[j]>e[j+1]){swap(e[j],e[j+1]);swap(b[j],b[j+1]);}}}int end=e[1];c=1;for(int i=2;i<=n;i++){if(b[i]>=end){c++;end=e[i];}}cout<<c;return 0; }1375 - 【提高】攔截導彈方案求解-東方博宜OJhttps://oj.czos.cn/p/1375
思 路 :同 上 題
代 碼 :
#include<bits/stdc++.h> using namespace std; int n,q,k,x; int a[1100]; int m[1100],w[1100]; int main() {cin>>n;for(int i=1;i<=n;i++) cin>>m[i];for(int i=1;i<=n;i++){x=m[i];q=-1;for(int j=1;j<=k;j++){if(a[j]>=x){q=j;break;}}if(q==-1){k++;a[k]=x;w[i]=k;}else{ a[q]=x;w[i]=q;}} cout<<k<<endl;for(int i=1;i<=k;i++){cout<<i<<':';for(int j=1;j<=n;j++){if(w[j]==i) cout<<m[j]<<' ';}cout<<endl;}return 0; }總結
以上是生活随笔為你收集整理的递 归 ,递 推 ,贪 心,学 习 总 结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云计算大数据学习中心:python课程
- 下一篇: 有哪些好用的视频录制工具?