递归与递推
题目:打印第20个斐波那契数
改进版:数组记忆化
#include<bits/stdc++.h>
using namespace std;
//记忆化改进-减少递归次数
int data[25];
int fib(int n){
if(n==1|n==2){
data[n]=1;
return data[n];
}
if(n>=3){
data[n]=fib(n-1)+fib(n-2);
return data[n];
}
}
int main(){
cout<<fib(20);
return 0;
}
//递推法
//int fib[25];
//int main(){
// fib[1]=1;
// fib[2]=1;
// for(int i=3;i<=20;i++)
// fib[i]=fib[i-1]+fib[i-2];
// cout<<fib[20];
// return 0;
//}
题目:数字三角形
#include<bits/stdc++.h>
using namespace std;
int a[200][200],c[200][200],n;//c用来存储每个位置的最大路径和
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=i;j++)
cin>>a[i][j];
c[1][1]=a[1][1];//将顶部的值赋给 c 数组的对应位置,作为初始值。
for(int i=2;i<=n;i++)
for(int j=1;j<=i;j++)
//选择上一行的两个相邻位置中的较大值,然后加上当前位置的值,更新 c[i][j]
c[i][j]=a[i][j]+max(c[i-1][j],c[i-1][j-1]);
//输出最后一行中中间两个位置的较大值,即为整个数字三角形的最大路径和
cout<<max(c[n][(n+1)/2],c[n][(n+2)/2]);
return 0;
}