#include <iostream>
#include <algorithm>
using namespace std;
const int N=1001;
int n,d[N][N];
int m[N][N];
int trace[N];
int maxSum1(int i,int j)
{//方法一:带备忘录的递归
if(m[i][j])
return m[i][j];
if(i==n-1)
return m[i][j]=d[i][j];
int x=maxSum1(i+1,j);
int y=maxSum1(i+1,j+1);
return m[i][j]=d[i][j]+max(x,y);
}
int maxSum2()
{//方法二:用状态转移函数
for(int j=0;j<n;++j)
m[n-1][j]=d[n-1][j];
for(int i=n-2;i>=0;--i)
for(int j=0;j<=i;++j)
{
int x=m[i+1][j];
int y=m[i+1][j+1];
m[i][j]=d[i][j]+max(x,y);
}
return m[0][0];
}
void Trace()
{
for(int i=0;i<n-1;++i)
{
int rowmax=m[i][0],t=0;//数组m中每行最大值给rowmax,并记录所在的列下标t
for(int j=0;j<=i;++j)
if(m[i][j]>rowmax)
rowmax=m[i][j],t=j;
trace[i]=d[i][t];//将此行所选元素值给trace
if(i==n-2)//如果此时求得倒数第二行所选元素,那么最后一行所选元素也就确定了
trace[i+1]=d[i+1][t];
}
cout<<endl;
for(int i=0;i<n-1;++i)
cout<<trace[i]<<"-";
cout<<trace[n-1];
}
int main()
{
cin>>n;
for(int i=0;i<n;++i)
for(int j=0;j<=i;++j)
cin>>d[i][j];
cout<<maxSum2();Trace();
return 0;
}
数字三角形(递归+递推)
最新推荐文章于 2024-01-26 09:01:34 发布