题解 | #三角形最小路径和#

三角形最小路径和

https://www.nowcoder.com/practice/c9d44b73dc7c4dbfa4272224b1f9b42c

使用动态规划,从最后一个状态进行分解,设 dp[i][j] 表示在坐标(i,j)处能得到的最小总和,因为下一个点只能是当前点下方一个点,或者右下方一个点,那么 dp[i][j] 的表达式就是   dp[i][j] = min( dp[i-1][j],dp[i-1][j-1] ) +  c[i][j], c[i][j]表示当前点的数值。
需要注意两个特殊情况,就是当 j = 0 时,dp[i][j] 只能是当前点的数值加上 dp[i-1][j],因为没有其他位置可以走到这里。还有就是 i = j 的时候,dp[i][j] 只能是当前点数值加上 dp[i-1][j-1]。需要在循环填充dp表的时候设置判断条件。
根据状态转移方程可以看出 dp[i][j] 的状态之和 dp[i-1][j] 和 dp[i-1][j-1] 相关而且只在 i >= j时候有意义,所以在填充dp表的时必须是每一列依次往下填充。


int min(const int a,const int b)
{
    return a<b?a:b;
}


int minTrace(int** triangle, int triangleRowLen, int* triangleColLen ) 
{
    // write code here
    int dp[triangleRowLen][triangleRowLen];
    memset(dp, 0, sizeof(dp));
    
    for( int j = 0; j < triangleRowLen; ++j )
    {
        for( int i = j; i < triangleRowLen; ++i )
        {
            if( !j )                                           //j = 0 的情况
            {
                if( !i ) dp[i][j] = triangle[0][0];            //其实dp[0][0]是dp表的初始状态,但是写程序的时候发现在一开始设置好初始状态,for循环不好写,所以直接写进来                            
                else
                    dp[i][j] = dp[i-1][j] + triangle[i][j];
            }
            else if( j != 0 && i == j ) dp[i][j] = dp[i-1][j-1] + triangle[i][j];  //对角线的情况
            else dp[i][j] = min( dp[i-1][j-1],dp[i-1][j] ) + triangle[i][j];       //其余情况
        }
    }
    int res = dp[triangleRowLen-1][0];
    for( int i = 0; i < triangleRowLen; ++i )                                      //比较最后一行的所有数据,选出最小的就是答案
    {
        if( dp[triangleRowLen-1][i] < res ) res = dp[triangleRowLen-1][i];
    }
    
    return res;
}


最近一直在刷动态规划的题目,从刚开始的猪脑过载到自己能写出来,把结题思路记录下来,方便以后回看。之后会把之前刷过的题再整理一遍记录下来,希望秋招的时候考到的全是刷过的。
刷了这么多天的题,对于动态规划的解题思路主要是 从最后一个状态开始分解问题,写出转移方程,根据建立的dp表(一维,二维。。。)所代表的含义确定起始状态。再填充dp表。可能会忽视的点就是要根据转移方程确定填充方式,因为动态规划的当前状态之和前状态相关。

全部评论

相关推荐

01-17 18:15
已编辑
门头沟学院 前端工程师
从上午约我面试然后他迟到,然后中午发消息打电话给我说重约面试时间,我就该意识到。【管理不规范,只是这家公司最小的问题】他妈一个不是技术的人来给我技术面。。。连vvue什么?连react是什么?连普通的HTTP请求是什么?这些东西都不懂的人来给我做技术面,我真的。。。。他妈浪费我40分钟。。一天面了三场,这家公司属实牛逼。不停的问我说上班下班时间谁来派任务公司在哪个区发展怎么样,公司的管理模式什么样,培养机制怎么样带教负责什么。如果出bug了谁来负责。我真的求你了别闹了。我答了15分钟,我已经很不想回答了。然后他就问了我一些很招笑的面试问题。问我前端框架架构设计怎么设计,Websocket可以实现SSE吗??最后还要我硬说,为什么我们公司没转正?为什么?为什么?我说我怎么知道。。这是领导决定,又不是我决定,他说让我分析一下。。。我真的草了,这个人是来搞我的吗?我最后问我说这个没有技术面,他说他就是技术面虽然我今天面的另外两家也很逆天。一个人不停的吹牛,自己100人的公司是全国前几,吹牛了一个小时。我中途几次想跑,真的是底下玩手机在听他那吹牛。。然后最后来了句说,我承诺的东西要实现哦,不然的话,公司会追责的,我我请问我承诺了什么?从头到尾也没有说让我承诺什么。而且我只是作为一个小小的前端卡拉咪,应届生。我要承担什么??好崩溃。。好崩溃的,一天面了三场。两家1000-9999的公司。面试官问的都很傻逼,甚至有些东西我问他估计都答不出来。。&nbsp;我这是在干嘛呀?浪费我一天的时间,我的奶奶。。我本来是抱着说我很菜,我要面试中发现自己的问题,现在来看他妈的这三场面试,面试本身就是问题。。
点赞 评论 收藏
分享
评论
4
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务