给定一个正三角形数组,自顶到底分别有 1,2,3,4,5...,n 个元素,找出自顶向下的最小路径和。
每一步只能移动到下一行的相邻节点上,相邻节点指下行种下标与之相同或下标加一的两个节点。
数据范围:三角形数组行数满足
,数组中的值都满足 
例如当输入[[2],[3,4],[6,5,7],[4,1,8,3]]时,对应的输出为11,
所选的路径如下图所示:
[[10]]
10
[[2],[3,4],[6,5,7],[4,1,8,3]]
11
最小路径是 2 , 3 ,5 , 1
[[1],[-1000,0]]
-999
int minTrace(int** triangle, int triangleRowLen, int* triangleColLen ) {
int dp[201][200];
dp[0][0]=triangle[0][0];
for (int i=1; i<triangleRowLen; i++) {
dp[i][0]=dp[i-1][0]+triangle[i][0];
}
for (int i=1; i<triangleRowLen; i++) {
for (int j=1; j<triangleColLen[i]; j++) {
if (j==triangleColLen[i]-1) {
dp[i][j]=dp[i-1][j-1]+triangle[i][j];
}
else {
dp[i][j]=(dp[i-1][j-1]<dp[i-1][j]?dp[i-1][j-1]:dp[i-1][j])+triangle[i][j];
}
}
}
int min=dp[triangleRowLen-1][0];
for (int i=0; i<triangleColLen[triangleRowLen-1]; i++) {
if(dp[triangleRowLen-1][i]<min){
min=dp[triangleRowLen-1][i];
}
}
return min;
} /**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param triangle int整型二维数组
* @param triangleRowLen int triangle数组行数
* @param triangleColLen int* triangle数组列数
* @return int整型
*/
int minTrace(int** triangle, int triangleRowLen, int* triangleColLen ) {
int dp[201][200] = {0};
int min=0;
dp[0][0] = triangle[0][0];
//先记录整个第一列的dp值
for(int i=1; i<triangleRowLen; i++)
dp[i][0] = dp[i-1][0] + triangle[i][0];
//然后每一个数都是起点到该店的最小路径,为上一个或前一个的最小路径加上自己
for(int i=1; i<triangleRowLen; i++)
{
for(int j=1; j<(triangleColLen[triangleRowLen-1]); j++)
{
if(j == triangleColLen[i]-1)
{
dp[i][j] = dp[i-1][j-1]+triangle[i][j];
continue;
}
min = dp[i-1][j]<dp[i-1][j-1]?dp[i-1][j]:dp[i-1][j-1];
dp[i][j] = min+triangle[i][j];
}
}
min = dp[triangleRowLen-1][0];
for(int j=0; j<(triangleColLen[triangleRowLen-1]); j++)
{
if(dp[triangleRowLen-1][j]<min)
min = dp[triangleRowLen-1][j];
}
return min;
// write code here
}