问一段dp代码
  • 板块学术版
  • 楼主jeffyang
  • 当前回复2
  • 已保存回复2
  • 发布时间2020/9/22 22:21
  • 上次更新2023/11/5 12:46:11
查看原帖
问一段dp代码
177876
jeffyang楼主2020/9/22 22:21

有一个长为n的数组A,求所有满足0≤a≤b<n的A[b]-A[a]的和的最大值

水群时候看到的,题面不严谨,选出来的组合里的数字不能再用,下面是样例。

0 8 7 6 5 2 1 10
最大值为8-0 + 10-1 = 17
0 1 2 8 6 7 8 1 9
最大值为8-0 + 8-1 +  7-2 + 9-1 = 28
#include <vector>
#include <iostream>
using namespace std;

int main()
{
    vector<int> nums;
    int n;
    cin >> n;
    nums.resize(n + 1);
    for (int i = 0; i < n; i++)
        cin >> nums[i];
    int ha = n / 2 + 1;
    vector<vector<int>> dp(ha, vector<int>(n));

    for (int i = 0; i < ha; i++)
    {
        if (i != 1)
            dp[i][n - 1] = 0;
        else
            dp[i][n - 1] = nums[n - 1];
    }
    for (int i = n - 2; i >= 0; i--)
    {
        for (int j = 0; j < ha; j++)
        {
            if (j == 0)
                dp[j][i] = max(dp[j][i + 1], dp[j + 1][i + 1] - nums[i]);
            else if (j == ha - 1)
                dp[j][i] = max(dp[j][i + 1], dp[j - 1][i + 1] + nums[i]);
            else {
                dp[j][i] = max(dp[j - 1][i + 1] + nums[i], dp[j][i + 1]);
                dp[j][i] = max(dp[j][i], dp[j + 1][i + 1] - nums[i]);
            }
        }
    }
    cout << dp[0][0];

}

问题是上面这段代码里dp[i][j]是什么意思?

2020/9/22 22:21
加载中...