dp一维数组和二维数组如何追踪路径

本文探讨在学习动态规划(DP)时,如何在一维数组中追踪解决方案的路径。通常,二维数组能记录路径,但一维数组的值会被覆盖。通过额外记录上一步的下标,即使在一维数组中也能实现路径追踪。详细解析见原文。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

       刚开始学dp,学的是01背包,讲过两种方法,一种是开一个二维数组dp可以追踪路径,因为所有的dp都记录着,第二种方法是开一维数组,但是dp的值会被不断覆盖,没有办法从dp中找到之前走的路。但是会大大的改善空间和时间的复杂度。但是今天,要讲一个一维数组追踪路径的办法。


二维数组追踪法

之前看了一个博客讲的很清楚,可以去看一下这部分:https://blog.youkuaiyun.com/xp731574722/article/details/70766804

可以从图中看出所走的路。

void traceback()
{
    for(int i=n; i>1; i--)
    {
        if(dp[i][c]==dp[i-1][c])   //根据公式判断他等于上一步的哪个值。          
            x[i]=0;  //x[i]=0表示没有走过,x[i]=1表示走过。
        else
        {
            x[i]=1;
            c-=w[i];
        }
    }
    x[1]=(m[1][c]>0)?1:0;
}

**一维数组**
由于一维数组中的数值已经被重新赋值,无法追踪,所以我们要开一个数组,在每次得到dp时,将上一步的下标记录下来。
 


 dp[i]=dp[j]+1;  //这里给的是简单的公式,如果是max选择,要判断取得是哪个值,然后记录所取值得下标
    l[i]=j;

 然后就很奇妙了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值