数字三角形
运用dp动态规划
d[i][j]=a[i][j]+max(d[i+1][j],d[i+1][j+1]);
有两种方法:递推,记忆化搜索;
1:递推。
#include<stdio.h>
int max(int a,int b)//比大小
{
if(a<=b)
return b;
else
return a;
}
int main()
{
int m,a[100][100],dp[100][100];
scanf("%d",&m);
for(int i=0;i<m;i++)
for(int j=0;j<=i;j++)
{
scanf("%d",&a[i][j]);
}
for(int i=0;i<m;i++)
{
dp[m-1][i]=a[m-1][i];//将最后一排的数赋值给dp;
}
for(int i=m-2;i>=0;i--)
for(int j=0;j<=i;j++)
{
dp[i][j]=a[i][j]+max(dp[i+1][j],dp[i+1][j+1]);//逆序求最大值,由下往上;
}
printf("%d",dp[0][0]);//最大值为dp[0][0];
return 0;
}
2:记忆化搜索。
#include<stdio.h>
//#include<string.h>
int max(int a,int b)//比大小;
{
if(a<=b)
return b;
else
return a;
}
int d[100][100],a[100][100];int m;//全局变量;
int solve(int i,int j)
{
if(d[i][j]>=0)//标记是否被计算过,大于等于0,则已被计算过,无需重复计算;
return d[i][j];
else//否则,求最大值;
return d[i][j]=a[i][j]+(i==m-1?0:max(solve(i+1,j),solve(i+1,j+1)));
}
int main()
{
scanf("%d",&m);
for(int i=0;i<m;i++)
for(int j=0;j<=i;j++)
{
scanf("%d",&a[i][j]);
d[i][j]=-1;//初始化为-1;
}
for(int i=m-2;i>=0;i--)
for(int j=0;j<=i;j++)
{
solve(i,j);//调用函数;
}
printf("%d",d[0][0]);//输出最大;
return 0;
}