日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第一章:递推与递归 【完结】

發布時間:2025/3/20 编程问答 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第一章:递推与递归 【完结】 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目前,這一章都已經熟練掌握了。

目錄

  • 92. 遞歸實現指數型枚舉 【板子題】
  • 94. 遞歸實現排列型枚舉 【板子題】
  • 93. 遞歸實現組合型枚舉【板子題】
  • 717. 簡單斐波那契 【簡單 / 遞推】
  • 95. 費解的開關 【二進制枚舉 / 遞推】
  • 1208. 翻硬幣 【遞推】
  • 116. 飛行員兄弟 【二進制枚舉 】
  • 1209. 帶分數 【枚舉】

在用遞歸的時候可以先畫一個遞歸樹來分析。

92. 遞歸實現指數型枚舉 【板子題】


題目詳解

#include<bits/stdc++.h> using namespace std; int a[30],vis[30],n; void dfs(int index) {if(index==n){for(int i=0;i<n;i++) if(vis[i]==1) cout<<i+1<<" ";cout<<endl;return;}vis[index]=1;//選dfs(index+1);vis[index]=0;//不選dfs(index+1); } int main(void) {cin>>n;dfs(0);return 0; }

注意: 遞歸一定要恢復現場。

94. 遞歸實現排列型枚舉 【板子題】


題目詳解

#include<cstdio> #include<iostream> int state[10];//0代表還沒有選數,1~n代表放了哪個數 bool m[10];//true表示用過,false表示沒有用過 int n; void dfs(int u)//第幾個位置 {if(u==n){for(int i=0;i<n;i++){printf("%d ",state[i]);}printf("\n");return;}for(int i=1;i<=n;i++)//枚舉所有的數,看哪個可以選 {if(!m[i])//該數沒有被選 {m[i]=true;//狀態表示選了 state[u]=i;//選這該數 dfs(u+1);//開始選下一個位置 m[i]=false;//恢復現場 state[u]=0;//恢復現場 }} } int main(void) {scanf("%d",&n);dfs(0);return 0; }

可以用現有的函數實現全排列

#include<cstdio> #include<algorithm> using namespace std; int a[10]={1,2,3,4,5,6,7,8,9}; int main(void) {int n;scanf("%d",&n);do{for(int i=0;i<n;i++){printf("%d ",a[i]);}printf("\n");}while(next_permutation(a,a+n));return 0; }

93. 遞歸實現組合型枚舉【板子題】


題目詳解
代碼如下:

#include<cstdio> #include<iostream> #include<cstring> using namespace std; int m,n; int ways[30]; void dfs(int u,int start)//u 代表當前是第幾位 start表示選的數從哪里開始遍歷 {if(u==m+1)//選夠了 {for(int i=1;i<=m;i++){printf("%d ",ways[i]);}puts("");//回車,這是一種比printf() 簡單的寫法return; }for(int i=start;i<=n;i++)//枚舉元素 {ways[u]=i;dfs(u+1,i+1);ways[u]=0;//恢復現場 } } int main(void) {cin>>n>>m;dfs(1,1);return 0; } #include<bits/stdc++.h> using namespace std; int a[30],vis[30],n,m; void dfs(int index,int start) {if(index==m){for(int i=0;i<m;i++) cout<<a[i]<<" ";cout<<endl;return;}for(int i=start;i<=n;i++){if(!vis[i]){a[index]=i;vis[i]=1;dfs(index+1,i);vis[i]=0;}} } int main(void) {cin>>n>>m;dfs(0,1);return 0; }

717. 簡單斐波那契 【簡單 / 遞推】

#include<bits/stdc++.h> using namespace std; const int N=1010; typedef long long int LL; LL a[N],n; int main(void) {cin>>n;a[1]=0,a[2]=1;for(int i=3;i<=n;i++) a[i]=a[i-1]+a[i-2];for(int i=1;i<=n;i++) cout<<a[i]<<" ";return 0; }

95. 費解的開關 【二進制枚舉 / 遞推】


題目詳解

#include<bits/stdc++.h> using namespace std; int a[30][30],b[30][30],n; int dx[5]={0,-1,0,1,0}; int dy[5]={0,0,1,0,-1}; void turn(int x,int y) {for(int i=0;i<5;i++){int tempx=x+dx[i];int tempy=y+dy[i];if(tempx>=0&&tempx<5&&tempy>=0&&tempy<5) b[tempx][tempy]^=1;} } int dfs() {int ans=10;for(int k=0;k<32;k++){int cnt=0;memcpy(b,a,sizeof b);for(int i=0;i<5;i++) if(k>>i&1) turn(0,i),cnt++;for(int i=1;i<5;i++)for(int j=0;j<5;j++) if(!b[i-1][j]) turn(i,j),cnt++;bool flag=true;for(int i=0;i<5;i++) if(!b[4][i]) flag=false; //判斷最后一排是不是都是亮的 if(flag) ans=min(ans,cnt);}if(ans>6) return -1;else return ans; } int main(void) {cin>>n;while(n--){string s[10];for(int i=0;i<5;i++) cin>>s[i];for(int i=0;i<5;i++)for(int j=0;j<5;j++)a[i][j]=s[i][j]-'0';cout<<dfs()<<endl;}return 0; }

1208. 翻硬幣 【遞推】


題目詳解

#include<bits/stdc++.h> using namespace std; string a,b; int main(void) {cin>>a>>b;int ans=0;for(int i=1;i<b.size();i++){if(b[i-1]!=a[i-1]){b[i-1]=a[i-1];if(b[i]=='*') b[i]='o';else b[i]='*';ans++;}}cout<<ans;return 0; }

116. 飛行員兄弟 【二進制枚舉 】


題目詳解

#include<bits/stdc++.h> using namespace std; typedef pair<int,int> PII; int a[10][10],b[10][10]; void turn(int x,int y) {for(int i=0;i<4;i++) b[x][i]^=1,b[i][y]^=1;b[x][y]^=1;//按了兩次得再按一次 } int main(void) {string s[10];for(int i=0;i<4;i++) cin>>s[i];for(int i=0;i<4;i++)for(int j=0;j<4;j++)if(s[i][j]=='+') a[i][j]=0;else a[i][j]=1;vector<PII> ans;for(int i=0;i<(1<<16);i++){vector<PII>temp;memcpy(b,a,sizeof a);for(int j=0;j<16;j++){if( (i>>j) & 1 ){turn(j/4,j%4);temp.push_back({j/4,j%4});}}bool flag=true;for(int j=0;j<4;j++)for(int k=0;k<4;k++)if(!b[j][k]) flag=false;if(flag && ( ans.size()>temp.size() || ans.empty() ) ) ans=temp;}cout<<ans.size()<<endl;for(auto op: ans) cout<<op.first+1<<" "<<op.second+1<<endl;return 0; }

1209. 帶分數 【枚舉】


詳細解析

#include<bits/stdc++.h> using namespace std; int a[10],ans; int get(int l,int r) {int sum=0;for(int i=l;i<=r;i++) sum=sum*10+a[i];return sum; } int main(void) {int n; cin>>n;for(int i=1;i<=9;i++) a[i]=i;do{for(int i=1;i<=7;i++){for(int j=i+1;j<=8;j++){int a=get(1,i);if(a>n) continue;int b=get(i+1,j);int c=get(j+1,9);if(b%c==0&&a+b/c==n) ans++;}}}while(next_permutation(a+1,a+10));cout<<ans;return 0; }

acwing會TLE 其它oj可以過

#pragma GCC optimize(2) #include<bits/stdc++.h> using namespace std; int n; string s="123456789"; int main(void) {cin>>n;int cnt=0;do{for(int i=1;i<=7;i++){int a=stoi(s.substr(0,i));if(a>n) continue;for(int j=1;j<=8-i;j++){int b=stoi(s.substr(i,j));int c=stoi(s.substr(i+j));if(b%c!=0) continue;else{if(a+b/c==n) cnt++;}}}}while(next_permutation(s.begin(),s.end()));printf("%d\n",cnt);return 0; }

總結

以上是生活随笔為你收集整理的第一章:递推与递归 【完结】的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。