题目
算法 线性dp 时间复杂度 n^2
思路分析
因为是三角形的堆,纵坐标改成斜向的更容易表示。
状态表达式 : f[i][j] 表示从(1,1)点走到(i,j)点的最小路径。含义为 max;
状态转移方程 :f[i][j]=max(f[i-1][j-1]+g[i][j],f[i-1][j]+g[i][j]);
解释:下方的点只能由上方的两肩上的点得到,就等于这两点的f值+当前位置上的点。
初始化 :就是不用通过迭代直接可以知道的量或者边界问题的量
把f的值初始全都设置为负无穷。
f[1][1]=g[1][1];
代码
#include<iostream>
#include<cstring>
using namespace std;
const int N=510;
int g[N][N];
int f[N][N];
int n;
int main()
{
memset(f,-1e2,sizeof f);
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
cin>>g[i][j];
}
}
f[1][1]=g[1][1];
for(int i=2;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
f[i][j]=max(f[i-1][j-1]+g[i][j],f[i-1][j]+g[i][j]);
}
}
int max=-0x3f3f3f3f;
for(int i=1;i<=n;i++)
{
if(f[n][i]>max)
max=f[n][i];
}
cout<<max;
}
tips:
小问题:有什么高效的方式将数组初始化成负无穷?