此代码适用于问题DIGJUMP。
它为我尝试的所有输入提供了正确的输出(我已经尝试了很多)。但问题是它在codechef上提交它时会得到TLE。我检查了社论,并且相同的解决方案(概念方面)被接受,因此这意味着算法方法是正确的。我必须在实施中出错。
我尝试了很长时间,但无法弄清楚出了什么问题。
#include <string.h>
#include <vector>
#include <queue>
#include <stdio.h>
using namespace std;
class Node
{
public:
int idx, steps;
};
int main()
{
char str[100001];
scanf("%s", str);
int len = strlen(str);
vector<int> adj[10];
for(int i = 0; i < len; i++)
adj[str[i] - '0'].push_back(i);
int idx, chi, size, steps;
Node tmpn;
tmpn.idx = 0;
tmpn.steps = 0;
queue<Node> que;
que.push(tmpn);
bool * visited = new bool[len];
for(int i = 0; i < len; i++)
visited[i] = false;
while(!que.empty())
{
tmpn = que.front();
que.pop();
idx = tmpn.idx;
steps = tmpn.steps;
chi = str[idx] - '0';
if(visited[idx])
continue;
visited[idx] = true;
if(idx == len - 1)
{
printf("%d\n", tmpn.steps);
return 0;
}
if(visited[idx + 1] == false)
{
tmpn.idx = idx + 1;
tmpn.steps = steps + 1;
que.push(tmpn);
}
if(idx > 0 && visited[idx - 1] == false)
{
tmpn.idx = idx - 1;
tmpn.steps = steps + 1;
que.push(tmpn);
}
size = adj[chi].size();
for(int j = 0; j < size; j++)
{
if(visited[adj[chi][j]] == false)
{
tmpn.idx = adj[chi][j];
tmpn.steps = steps + 1;
que.push(tmpn);
}
}
}
return 0;
}
答案 0 :(得分:0)
此解决方案无法在可接受的时间内完成此问题。请记住,BFS是O(E)。在具有某种O(n)数字的字符串中,在这些数字之间存在O(n ^ 2)个边。对于N = 10 ^ 5 O(N ^ 2)太多。
这需要一些优化,比如我们从类似的节点来到当前节点,我们不会进一步跳到类似的节点。