短裤获得TLE的罕见子序列

时间:2019-07-16 17:00:17

标签: c++ c++14

最短的子序列。

Gary有两个字符串S和V。现在Gary想知道S中的长度最短的子序列,以使其不是V中的子序列。

样本输入: babbab 巴巴 样本输出: 3

我尝试实现递归dp。我不想重复做。 我看过各种网站,但没有一个使用dp的递归解决方案。我想知道如果我以迭代方式而不是递归dp进行操作,那么时间复杂度会有什么不同。

#include <bits/stdc++.h>
using namespace std;

int helper(string s, string v, int m, int n, int ** dp)
{
    if(m == 0)
    {
        return 1002;
    }

    if(n <= 0)
    {
        return 1;
    }

    int k; int ans;
    for(k = 0; k < n; k++)
    {
        if(s[0] == v[k])
        {
            break;
        }
    }

    if(k == n)
    {
        return 1;
    }

    if(dp[m][n] != -1)
    {
        return dp[m][n];
    }

    ans = min(helper(s.substr(1), v, m - 1, n, dp), 1 + helper(s.substr(1), v.substr(k + 1), m - 1, n - k - 1, dp));
    dp[m][n] = ans;
    return ans;
}

int solve(string s,string v)
{
    int m = s.length();
    int n = v.length();
    int ** dp = new int *[m + 1];
    for(int i = 0; i <= m; i++)
    {
        dp[i] = new int[n + 1];
        for(int j = 0; j <= n; j++)
        {
            dp[i][j] = -1;
        }
    }

    int ans = helper(s, v, m, n, dp);
    for(int i = 0; i <= m; i++)
    {
        delete[] dp[i];
    }
    delete[] dp;

    return ans;
}

超出获取时间限制。

0 个答案:

没有答案