c++ - 如何改进此算法以防止 TLE 是 SPOJ 提交?

标签 c++ algorithm data-structures dynamic-programming

我正在尝试解决以下问题: http://www.spoj.pl/problems/TRIP/

我使用 C++ 中的 DP(动态编程)编写了一个解决方案(下面发布了代码)。但是我得到 TLE(超出时间限制)。如何优化我的代码?

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<vector>
#include<algorithm>
#include<cmath>

using namespace std;
string a,b;
vector<string> v;
int dp[85][85];

void filldp()
{
    for(int i = 0; i <= a.length(); i++)
        dp[i][0] = 0;
    for(int i = 0; i <= b.length(); i++)
        dp[0][i] = 0;   

    for(int i = 1; i <= a.length(); i++)
        for(int j = 1; j<= b.length(); j++)
        if(a[i-1] == b[j-1])
            dp[i][j] = dp[i-1][j-1] + 1;
        else
            dp[i][j] = max(dp[i-1][j], dp[i][j-1]); 
}

vector<string> fillv(int i, int j)
{
    vector<string> returnset;
    if(i == 0 || j == 0)
    {   returnset.push_back("");
        return returnset;
    }

    if(a[i-1] == b[j-1])
        { 
          vector<string> set1 = fillv(i-1,j-1);
          for(int k = 0; k < set1.size(); k++)
          { 
            returnset.push_back(set1[k] + a[i-1]);
         }  
          return returnset;
        }

    else
        {
            if(dp[i][j-1] >= dp[i-1][j])
            {
                vector<string> set1 = fillv(i,j-1);
                returnset.insert(returnset.end(), set1.begin(), set1.end());
            }

            if(dp[i-1][j] >= dp[i][j-1])
            {
                vector<string> set2 = fillv(i-1,j);
                returnset.insert(returnset.end(), set2.begin(), set2.end());
            }

            return returnset;

        }       

}

void output()
{
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
    for(int i = 0; i < v.size(); i++)
        cout << v[i] << endl;   
    cout << endl;       
}

int main()
{
    int T;
    cin >> T;

    while(T--)
    {
        memset(dp,-1,sizeof(dp));
        v.clear();
        cin >> a >> b;
        filldp();
        v = fillv(a.length(), b.length());
        output();
    }
    return 0;
}

我的猜测是,有很多数据结构的传递是可以避免的,但我不知道如何避免。

最佳答案

您做的第一个错误是使用 cin 和 cout,它们非常慢。切勿将 cin 和 cout 用于竞赛编程!通过将 cin/cout 更改为 scanf/printf,我已经从 TLE 转到 AC。

关于c++ - 如何改进此算法以防止 TLE 是 SPOJ 提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9937205/

相关文章:

c++ - 如何将 qspaceritem 添加到 qgridlayout

c++ - 如何仅在本地 header 上运行预处理器?

java - 链表添加一个元素到列表的末尾

c++ - 使用 set 对 log(N) 进行排序?

algorithm - 使用递归查找数组中的第二大元素

c++ - 返回 std:vector 与 std::async c++11

c++ - 如何在C++(QT框架)中构建一个带有UTF字符的字符串

java - QuickSort 实现中的 ArrayIndexOutofBoundsException

algorithm - kruskal 算法的性能如何受到不相交集数据结构的影响?

c++ - C++中Concurrent Queue + map的实现