120. 三角形最小路径和
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
说明:
如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。
这里采用一维数组DP,满足空间O(n)
//dp为一维数组的解法,空间O(n)
//triangle是二维数组
//triangleColSize是一维数组,存放每一行数组的列数
//triangleSize是三角形行数
int min(int x,int y)
{
return x<y ? x : y;
}
int minimumTotal(int** triangle, int triangleSize, int* triangleColSize){
int i,j;
int *dp;
dp = malloc (sizeof(int)*triangleSize);
//初始化的dp[]为三角形的最后一行
for(i=0;i<triangleColSize[triangleSize-1];i++)
{
//dp[i]=triangle[triangleColSize[triangleSize-1]][i];
dp[i]=triangle[triangleSize-1][i];
}
//状态转移方程dp[j]=triangle[i][j]+min(dp[j],dp[j+1])
for(i=triangleSize-2;i>=0;i--)
{
for(j=0;j<triangleColSize[i];j++)
{
dp[j] = min ( dp[j], dp[j+1] ) + triangle[i][j];
}
}
//输出结果dp[0]
return dp[0];
}