#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;
// }
// }
洛谷——《递推和递归》
最新推荐文章于 2025-04-06 20:56:30 发布