用于求出长度增加序列3的最低成本的算法

时间:2018-06-10 13:24:46

标签: algorithm dynamic-programming

假设我们有一个长度为n的序列。该序列中的每个数字都有一个权重。我们希望通过动态编程找到长度为3的最小加权增长子序列。我们怎么能这样做?

示例:

sequnce:2 4 5 4 10

体重:40 30 20 10 40

答案是90(2 4 10)

1 个答案:

答案 0 :(得分:0)

我已经在一些代码强制解决了这个完全相同的问题。 (http://codeforces.com/contest/987/problem/C

我的解决方案是O(N ^ 2),其中N是房屋数量。

它的工作原理如下,对于每个房子,我将搜索属于K右边的最便宜的房子。

一旦我掌握了这些信息,我就会尝试所有可能的对(i,j),使得height [i]<高度[j]和这对最便宜的房子的总和比位置j的房子高。

这是我的代码!

#include <bits/stdc++.h>
using namespace std;
constexpr int inf = 0x3f3f3f3f;

int main()
{
    int n;
    ios::sync_with_stdio(0);
    cin.tie(0);

    cin >> n;
    vector<int> height(n);
    for(int i = 0; i < n; ++i) cin >> height[i];

    vector<int> cost(n);
    for(int i = 0; i < n; ++i) cin >> cost[i];

    vector<int> cheapestToTheRight(n, inf);

    cheapestToTheRight[n-1] = inf;

    for(int k = n - 2; k >= 0; --k)
    {
        for(int nxt = k + 1; nxt < n; ++nxt)
        {
            if(height[nxt] > height[k])
            {
                cheapestToTheRight[k] = min(cheapestToTheRight[k], cost[nxt]);
            }
        }
    }

    int ans = inf;

    for(int i = 0; i < n; ++i)
    {
        for(int j = i + 1; j < n; ++j)
        {
            if(height[i] < height[j])
            {
                if(cheapestToTheRight[j] != inf)
                {
                    ans = min( ans, cost[i] + cost[j] + cheapestToTheRight[j]);
                }
            }
        }
    }

    if(ans == inf)
    {
        cout << -1 << endl;
    }

    else cout << ans << endl;
    return 0;
}

这是我的submition(http://codeforces.com/contest/987/submission/38734180)的链接,但代码更脏,并且上面有一些葡萄牙语变量名。