动态优化的再次优化,将dp数组从二维改为一维

此文上接:

1、记忆化搜索与动态优化与背包问题
https://blog.csdn.net/qq_28120673/article/details/81037700
2、使用递推关系的动态规划dp解决问题(最长公共子序列和完全背包问题)
https://blog.csdn.net/qq_28120673/article/details/81043671

通过上面的讨论,已近解决了动态规划的使用问题。上面的背包问题中,我们使用了二维数组来存储规划过程,基本上可以说动态规划是利用空间换取时间的方法。在计算中可以发现其实数组是可以重复使用的,我们可以只是用一行数组记录动态规划过程。

在01背包问题中,将dp[MAX_N+1][MAX_N+1]改为dp[MAX_N+1]。在i的每次循序将第二行数据覆盖第一行。
其算法如下:

int dp[MAX_W+1];
void solve(){
    for(int i=0;ifor(int j=W;j>=w[i];j--){
            dp[j]=max( dp[j],dp[j-w[i]]+v[i]);
        }
    }
    cout<

完全背包问题中有类似的方法:
代码如下:

int dp[MAX_W+1];
void solve(){
    for(int i=0;ifor(int j=w[i];j<=W;j++){
            dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
        }
    }
    cout<

仔细观察方向,这两个算法的差别在于循环方向不同。

你可能感兴趣的:(程序设计)