题目大意:
有一个由非负整数组成的三角形,第一行只有一个数,除了最下行之外每个数的左下方和右下方各有一个数,如图
1
3 2
4 10 1
4 3 2 20
从第一行的数开始,每次可以往左下或右下走一格,直到走到最下行,把沿途经过的数全部加起来,如何走才能使得这个和尽量大。
传统
#include<iostream>
#define MAX 101
using namespace std;
int D[MAX][MAX];
int n;
int solvemax(int a,int b)
{
return (a<b)?b:a;
}
int MaxSum(int i,int j)
{
if (i==n){
return D[i][j];
}
int x=MaxSum(i+1,j);
int y=MaxSum(i+1,j+1);
return solvemax(x,y)+D[i][j];
}
int main()
{
int i,j;
cin>>n;
for (i=1;i<=n;i++){
for (j=1;j<=i;j++){
cin>> D[i][j];
}
}
cout<<MaxSum(1,1)<<endl;
return 0;
}
改进
#include<iostream>
#define MAX 101
using namespace std;
int D[MAX][MAX];
int n;
int flag[MAX][MAX];
int solvemax(int a,int b)
{
return (a<b)?b:a;
}
int MaxSum(int i,int j)
{
if (flag[i][j]!=-1){//说明已经计算过
return flag[i][j];
}
if (i==n){
flag[i][j]=D[i][j];
}
else
{
int x=MaxSum(i+1,j);
int y=MaxSum(i+1,j+1);
flag[i][j]=solvemax(x,y)+D[i][j];
}
return flag[i][j];
}
int main()
{
int i,j;
cin>>n;
for (i=1;i<=n;i++){
for (j=1;j<=i;j++){
cin>> D[i][j];
flag[i][j]=-1;
}
}
cout<<MaxSum(1,1)<<endl;
return 0;
}
递推
这段程序我自己没能写成功,大体意思是知道了,就是“人人为我”。
盗取程序:
#include<stdio.h>
#include<iostream>
#include "algorithm"
using namespace std;
int a[100][100];
int d[100][100];
int max1(int a,int B)
{
return a>B?a:B;
}
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0)
break;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
scanf("%d",&a[i][j]);
}
for( i=1;i<=n;i++)
d[n][i]=a[n][i];
for( i=n-1;i>=1;i--)
{
for(int j=1;j<=i;j++)
{
d[i][j]=max1(d[i+1][j],d[i+1][j+1])+a[i][j];
}
}
printf("%d\n",d[1][1]);
}
return 0;
}