Sto cercando di risolvere il seguente problema: http://www.spoj.pl/problems/TRIP/Come posso migliorare questo algoritmo per impedire che TLE sia inviato da SPOJ?
ho scritto una soluzione che utilizza DP (Programmazione Dinamica) in C++ (codice pubblicato sotto). Ma ottengo TLE (limite di tempo superato). Come posso ottimizzare il mio codice?
#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;
}
La mia ipotesi è che c'è un sacco di passando intorno di strutture di dati che possono essere evitati, ma non riesco a capire come esattamente.
Cos'è il TLE? Evasività di tre lettere? Otterrete risposte più/migliori se non richiedete ai rispondenti di avere familiarità con il gergo di una particolare sotto-cultura. – RBarryYoung