洛谷——《递推和递归》

本文介绍了C++中的几种算法实现,包括递推关系、斐波那契数列计算、感染问题模拟、数塔问题求解、高精度加法以及Catalan数计算,展示了在解决特定问题时的代码实现和思路.

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include<iostream>
#include<iomanip>
#include<cmath>
#include<string.h>
#include<string>
#include <ctime>
#include<cstdlib>
#include<algorithm>
#include<cstdio>
using namespace std;

//递推关系:前一项和后一项的关系
//递推式:前一项和后一项的关系表达式
//通项公式:第n项的表达式

//等比1,2,4
// int f(int n)
// {
//     if(n==1)return 1;
//     return 2*f(n-1);
// }
// //斐波那契
// int f1(int n)
// {
//     if(n==1||n==2)return 1;
//     return f1(n-1)+f1(n-2);
// }
// int f2(int n)
// {
//     if(n==1)return 1;
//     if(n==2)return 2;
//     if(n==3)return 3;
//     return f2(n-3)*f2(n-2)*f2(n-1);
// }
// int arr[1000][2];

// int main()
// {
//     int n;
//     cin>>n;
//     arr[1][0] = 9;
//     arr[1][1] = 1;
//     for(int i =2;i<=n;i++)
//     {
//         int x =9;
//         if(i==n)x = 8;
//         arr[i][0] = (arr[i-1][0]*x+arr[i-1][1])%12345;
//         arr[i][1] = (arr[i-1][1]*x+arr[i-1][0])%12345;
//     }
//     cout<<arr[n][0];
// }

// int f3(int m, int n)
// {
//     if(m<=1||n<=1)return 1;
//     if(n>m)return f3(m,m);
//     return f3(m-n,n)+f3(m,n-1);
// }

//感染问题
// char a[100][100],b[100][100];
// int main()
// {
//     int n,m,ans =0;
//     cin>>n>>m;
//     for(int i =1;i<=n;i++)
//     {
//         for(int j =1;j<=n;j++)cin>>a[i][j];
//     }
//     for(int i =2;i<=m;i++)
//     {
//         for(int j= 1;j<=n;j++)
//         {
//             for(int k = 1;k<=n;k++)
//             {
//                 if(a[j][k]=='@')
//                 {
//                     if(a[j-1][k]=='.')b[j-1][k] = '@';
//                     if(a[j][k+1]=='.')b[j][k+1] = '@';
//                     if(a[j+1][k]=='.')b[j+1][k] = '@';
//                     if(a[j][k-1]=='.')b[j][k-1] = '@';
//                     ans++;
//                 }
//             }
//         }
//         for(int j= 1;j<=n;j++)
//         {
//             for(int k = 1;k<=n;k++)
//             {
//                 if(b[j][k]=='@')
//                 {
//                     a[j][k]='@';
//                     ans++;
//                 }
//             }
//         }
//         cout<<ans;
//     }
// }

//数塔问题
// int max(int a,int b)
// {
//     if(a>b)return a;
//     else return b;
// }
// int arr[102][102];
// int main()
// {
//     int n,ans =0;
//     cin>>n;
//     for(int i =1;i<=n;i++)
//     {
//         for(int j =1;j<=i;j++)cin>>arr[i][j];
//     }

//     for(int i =2;i<=n;i++)
//     {
//         for(int j =1;j<=i;j++)
//         arr[i][j] += max(arr[i-1][j],arr[i+1][j+1]);
//     }
//     for(int j =1;j<=n;j++)
//     {
//         ans = max(arr[n][j],ans);
//     }
//     cout<<ans;
// }

// p1255
// 1.递推式 f(n) = f(n-1)+f(n-2)
// 2.f(1) = 1,f(2) = 2
// 递归(50分)
// long long fun(int n)
// {
//     if(n==1)return 1;
//     if(n==2)return 2;
//     return fun(n-1)+fun(n-2);
// }
// // 改用数组(60分)

// //用高精度加法(成功)
// string add(string a,string b)
// {
//     string c;
//     int s1[10000] = {0};
//     int s2[10000] = {0};
//     int s3[10000] = {0};
//     int len_a = a.length();
//     int len_b = b.length();
//     int len_c = max(len_a, len_b);
//     //逆序
//     for(int i =0;i<len_a;i++)
//     {
//         s1[i] = a[len_a-1-i]-'0';
//     }
//     for(int i =0;i<len_b;i++)
//     {
//         s2[i] = b[len_b-1-i]-'0';
//     }
//     //相加
//     for(int i =0;i<len_c;i++)
//     {
//         s3[i] += (s1[i] + s2[i]);
//         if(s3[i]>=10)
//         {
//             s3[i+1] +=s3[i]/10;
//             s3[i] %=10; 
//         }
//     }
//     //判断进位
//     if(s3[len_c]>0)len_c++;
//     for(int i =0;i<len_c;i++)
//     {
//         c +=to_string(s3[len_c-1-i]);
//     }
//     return c;
// }
// string arr[10000];
// int main()
// {
//     int n;
//     cin>>n;
//     arr[1] = "1";
//     arr[2] = "2";
//     for(int i =3;i<=n;i++)
//     {
//         arr[i] = add(arr[i-1],arr[i-2]);
//     }
//     cout<<arr[n];
// }

//p1002
// 1.递推关系:任意一点路径是左路径+右路径
// 2.将马能干涉的位置设置(60分)

// long long arr[100][100];
// int main()
// {
//     int n,m,x,y;
//     cin>>n>>m>>x>>y;
//     //设置马干涉点
//     arr[x][y] = -1;
//     for(int i =x-2;i<=x+2;i++)
//     {
//         if(i<0)continue;
//         for(int j =y-2;j<=y+2;j++)
//         {
//             if(j<0)continue;
//             if((i==x-2||i==x+2)&&(j==y-1||j==y+1))arr[i][j] = -1;
//             if((i==x-1||i==x+1)&&(j==y-2||j==y+2))arr[i][j] = -1;
//         }
//     }
//     for(int i =1;i<=n;i++)if(arr[i][0]!=-1)arr[i][0] = 1;
//     for(int j =1;j<=m;j++)if(arr[0][j]!=-1)arr[0][j] = 1;
//     for(int i =1;i<=n;i++)
//     {
//         for(int j =1;j<=m;j++)
//         {
//             if(arr[i][j]==-1)continue;
//             long long up = (arr[i-1][j] ==-1)?0:arr[i-1][j];
//             long long left = (arr[i][j-1]==-1)?0:arr[i][j-1];
//             arr[i][j] = up+left;
//         }
//     }
//     cout<<arr[n][m];
// }

// p1044
// catalan
// long long arr[50];
// int main()
// {
//     int n;
//     long long count =0;
//     cin>>n;
//     arr[0] = 1;
//     arr[1] = 1;
//     for(int i =2;i<=n;i++)
//     {
//         for(int j =0;j<=i-1;j++)
//         {
//             arr[i] +=arr[j]*arr[i-1-j];
//         }
//     }
//     cout<<arr[n];
// }
// p1028
// int arr[1000];
// int count(int num)
// {
//     int ans = 1;
//     if(num==1)return 1;
//     if(arr[num]!=-1)return arr[num];
//     for(int i =1;i<=num/2;i++)
//     {
//         ans +=count(i);
//     }
//     return arr[num] = ans;
// }
// int main()
// {
//     int n;
//     cin>>n;
//     memset(arr,-1,1000*sizeof(int));
//     arr[1] = 1;
//     cout<<count(n);
// }

//1464
// long long arr[100][100][100];
// long long w(long long a,long long b,long long c)
// {
//     if(a<=0||b<=0||c<=0)return 1;
//     if(a>20||b>20||c>20)return w(20,20,20);
//     if(arr[a][b][c]!=0)return arr[a][b][c];
//     if(a<b&&b<c)return arr[a][b][c] = w(a,b,c-1)+w(a,b-1,c-1)-w(a,b-1,c);
//     else return arr[a][b][c] = w(a-1,b,c)+w(a-1,b-1,c)+w(a-1,b,c-1)-w(a-1,b-1,c-1);
// }
// int main()
// {
//     long long a,b,c;
//     while(cin>>a>>b>>c)
//     {
//         if(a==-1&&b==-1&&c==-1)break;
//         cout<<"w("<<a<<", "<<b<<", "<<c<<") = "<<w(a,b,c)<<endl;
//     }
// }

//p1928
//1.递推前一项是后一项的一层解码
//2.跳出条件:没有[]
// string expand()
// {
//     string s,X;
//     char ch;
//     int D;
//     while(cin>>ch)
//     {
//         if(ch=='[')
//         {
//             cin>>D;
//             X = expand();
//             while(D--)s+=X;
//         }
//         else if(ch==']')
//         {
//             return s;
//         }
//         else s+=ch;
//     }
//     return s;
// }
// int main()
// {
//     cout<<expand();
// }

//p2437
//递推规律:从m-->n===m-->n-1+m-->n-2//斐波那契
// 太大不能用递归
//高精度
// string add(string a,string b)
// {
//     string c;
//     int s1[10000] = {0};
//     int s2[10000] = {0};
//     int s3[10000] = {0};
//     int len_a = a.length();
//     int len_b = b.length();
//     int len_c = max(len_a, len_b);
//     //逆序
//     for(int i =0;i<len_a;i++)
//     {
//         s1[i] = a[len_a-1-i]-'0';
//     }
//     for(int i =0;i<len_b;i++)
//     {
//         s2[i] = b[len_b-1-i]-'0';
//     }
//     //相加
//     for(int i =0;i<len_c;i++)
//     {
//         s3[i] += (s1[i] + s2[i]);
//         if(s3[i]>=10)
//         {
//             s3[i+1] +=s3[i]/10;
//             s3[i] %=10; 
//         }
//     }
//     //判断进位
//     if(s3[len_c]>0)len_c++;
//     for(int i =0;i<len_c;i++)
//     {
//         c +=to_string(s3[len_c-1-i]);
//     }
//     return c;
// }
// string arr[10000];
// int main()
// {
//     int m,n;
//     cin>>m>>n;
//     int len = n-m;
//     arr[1] = "1";
//     arr[2] = "2";
//     for(int i =3;i<=len;i++)
//     {
//         arr[i] = add(arr[i-1],arr[i-2]);
//     }
//     cout<<arr[len];
// }

//1164
// int arr[1000000];
// int main()
// {
//     int n;
//     cin>>n;
//     arr[1] = 1;
//     arr[2] = 2;
//     arr[3] = 5;
//     for(int i =4;i<=n;i++)
//     {
//         arr[i] = (arr[i-1]*2)%10000+arr[i-3]%10000;
//         arr[i] %=10000;
//     }
//     cout<<arr[n];
// }

//p3612
//不行(40分)
// string a;
// int main()
// {
//     long long n;
//     cin>>a>>n;
//     long long len;
//     while(1)
//     {
//         len = a.length();
//         if(len>=n)break;
//         string b;
//         //旋转
//         b +=a[len-1];
//         for(long long i =0;i<len-1;i++)b+=a[i];
//         a+=b;
//     }
//     cout<<a[n-1];
// }

// string a;
// int main()
// {
//     long long n;
//     cin>>a>>n;
//     long long len = a.length();
//     while(len<n)
//     {
//         long long i =len;
//         while(n>2*i)i*=2;
//         n -=(i+1);
//         if(n==0) n =i;
//     }
//     cout<<a[n-1];
// }

// p1259
// 1.交换棋子
// char arr[100];
// string b[4] ={"ooo*o**--*", "o--*o**oo*", "o*o*o*--o*", "--o*o*o*o*"};
// void swap(int start,int end)
// {
//     char temp = arr[start];
//     arr[start] = arr[end];
//     arr[end] = temp;
// }
// void chess(int start,int end)
// {
//     swap(start,end);
//     swap(start+1,end+1);
// }
// void print_arr(int len)
// {
//     for(int i =0;i<=len;i++)cout<<arr[i];
//     cout<<endl;
// }
// int main()
// {
//     int n;
//     cin>>n;
//     for(int i =0;i<n;i++)arr[i] ='o';
//     for(int i =n;i<2*n;i++)arr[i] ='*';
//     arr[2*n] = '-';
//     arr[2*n+1] = '-';
//     print_arr(2*n+1);
//     int len =n;
//     while(1)
//     {
//         chess(len-1,2*len);
//         print_arr(2*n+1);
//         len--;
//         if(len==3)break;
//         chess(len,2*len);
//         print_arr(2*n+1);
//     }
//     for(int i =0;i<4;i++)
//     {
//         cout<<b[i];
//         for(int j =10;j<2*n+2;j++)cout<<arr[j];
//         cout<<endl;
//     }
// }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值