给定一个正三角形数组,自顶到底分别有 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 }