//动态规划例题ppt p22 数字三角形 1.递归
#include<iostream>
#include<cstring>
using namespace std;
int n;
int array[5][5];
int f(int r,int j)
{
if(r==n-1)
{
return array[r][j];
}
int num1=f(r+1,j);
int num2=f(r+1,j+1);
if(num1>num2)
{
return num1+array[r][j];
}
else{
return num2+array[r][j];
}
}
int main()
{
cin>>n; //5
memset(array,0,sizeof(array));
for(int i=0;i<n;i++)
{
for(int j=0;j<=i;j++)
{
cin>>array[i][j];
}
}
cout<<f(0,0)<<endl;
return 0;
}
//动态规划例题ppt p22 数字三角形 2.递归+备忘录,避免重复计算
#include<iostream>
#include<cstring>
using namespace std;
int n;
int array[5][5];
int maxsum[5][5]; //用来表示该位置有没有计算过,有就直接使用
int f(int r,int j)
{
if(r==n-1)
{
return array[r][j];
}
if(maxsum[r+1][j]==-1)//没有就计算
{
maxsum[r+1][j]=f(r+1,j);
}
if(maxsum[r+1][j+1]==-1)
{
maxsum[r+1][j+1]=f(r+1,j+1);
}
if(maxsum[r+1][j+1]>maxsum[r+1][j]) //直接使用计算过的
{
return maxsum[r+1][j+1]+array[r][j];
}
else{
return maxsum[r+1][j]+array[r][j];
}
}
int main()
{
cin>>n; //5
memset(array,0,sizeof(array));
memset(maxsum,-1,sizeof(maxsum));
for(int i=0;i<n;i++)
{
for(int j=0;j<=i;j++)
{
cin>>array[i][j];
}
}
cout<<f(0,0);
return 0;
}
//动态规划例题ppt p22 数字三角形 3.递推 自底向上计算最大路径,自上向下打印最终路径
#include<iostream>
#include<cstring>
using namespace std;
int array[5][5];
int array1[5][5];
int main()
{
int n;
cin>>n;
memset(array,0,sizeof(array));
for(int i=0;i<n;i++)
{
for(int j=0;j<=i;j++)
{
cin>>array[i][j];
array1[i][j]=array[i][j];
}
}
for(int i=n-2;i>=0;i--) //自底向上计算,可以算出最大的路径长
{
for(int j=0;j<=i;j++)
{
if(array[i+1][j]>array[i+1][j+1])//对左右两边的数字进行选择,较大的加上去
{
array[i][j]+=array[i+1][j];
}
else{
array[i][j]+=array[i+1][j+1];
}
//cout<<array[i][j]<<" ";
}
//cout<<endl;
}
cout<<array[0][0]<<endl;
cout<<"路径为:"<<array1[0][0]<<"--->";
int m=0;
for(int i=0;i<n-1;i++)
{
for(int j=m;j<=i;j++)
{
if(array[i+1][j]>array[i+1][j+1])
{
cout<<array1[i+1][j]<<"--->";
m=j;
break;
}
else{
cout<<array1[i+1][j+1]<<"--->";
m=j+1;
break;
}
}
}
return 0;
}