题目大意:
输入一个整数n,输入一个n行三角形,每行n个数,从最顶数字出发,每次只能加整下方或正下方右边那个数,一直加到最后一行,让你求加到最大一行的最大值并输出;
基本思路:
1.记忆性数组(dp)+递归;
2.递推型动态规划;
代码1如下:
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int maxn=100+10;
int n,sum[maxn][maxn],a[maxn][maxn];
int max_sum(int x,int y)
{
if(sum[x][y]!=-1) return sum[x][y];
if(x==n) return a[x][y];
int xx=max_sum(x+1,y);
int yy=max_sum(x+1,y+1);
sum[x][y]=max(xx,yy)+a[x][y];
return sum[x][y];
}
int main()
{
memset(sum,-1,sizeof(sum));
cin>>n;
for(int i=1;i<=n;++i)
for(int j=1;j<=i;++j)
cin>>a[i][j];
cout<<max_sum(1,1)<<endl;
}
代码2如下:
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
const int maxn=100+10;
int a[maxn][maxn],sum[maxn][maxn];
int n;
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
for(int j=1;j<=i;++j)
scanf("%d",&a[i][j]);
for(int j=1;j<=n;++j)
sum[n][j]=a[n][j];
for(int i=n-1;i>=1;i--)
for(int j=1;j<=i;++j)
{
sum[i][j]=max(a[i][j]+sum[i+1][j],a[i][j]+sum[i+1][j+1]);
}
cout<<sum[1][1]<<endl;
}
1219

被折叠的 条评论
为什么被折叠?



