动态规划学习

首先是01背包问题,可以把它看做是一个 表格行和列分别是体积从1,2,,,,v,每个物品的花费c1,c2,,,cn,每个空格里的数代表放入第i个物品在体积为j的背包里的最大价值。dp[j]表示体积为j的背包,放入物品后,可以得到的最大值。状态转移方程为if(j>=c[i]) dp[j]=max(dp[j],dp[j-c[i]]+w[i])。

关键代码:

for(int i = 0;i < n;i++)
            for(int j = v;j >= c[i];j--)
                dp[j]=max(dp[j-c[i]]+w[i],dp[j]);

其次是连续子序列的最大和,dp[i]表示以a[i]为结尾的连续子序列的最大和,则状态转移方程为dp[i]=max(dp[i-1],a[i]),关键代码:

 for(int i = 1;i < n;i++)
            dp[i]=max(dp[i-1]+a[i],a[i]);

最后是最大严格递增子序列的和,个人感觉有点像01背包,可以看做是一个二维表格,每次都更新到最大值。dp[i]表示以a[i]为结尾的最大严格递增子序列的和。只要在i之前的,且比a[i]小的都满足条件。关键代码:

for(int i = 0;i < n;i++){
        dp[i]=a[i];
        for(int j = 0;j < i;j++){
            if(a[i]>a[j])
                dp[i]=max(dp[j]+a[i],dp[i]);
        
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_38122218/article/details/80380887
今日推荐