DFS有两个测试点超时,看来只能用动态规划做了,待补。
DFS代码:
#include <vector>
#include <cstdio>
using namespace std;
void dfs(vector<int> &v, int i, vector<int> &ret, int &maxSize)
{
if(i == v.size())
{
if(maxSize < ret.size()) maxSize = ret.size();
return;
}
if(ret.size() + v.size() - i < maxSize) return; // 剪枝
if(ret.size() == 0 || v[i] >= ret[ret.size() - 1])
{
ret.push_back(v[i]);
dfs(v, i+1, ret, maxSize);
ret.pop_back();
dfs(v, i+1, ret, maxSize);
}
else
dfs(v, i+1, ret, maxSize);
}
int main()
{
int N, M, L;
scanf("%d", &N);
scanf("%d", &M);
int priority[300] = {0};
for (int i = 1; i <= M; ++i)
{
int tmp;
scanf("%d", &tmp);
priority[tmp] = i;
}
vector<int> v;
scanf("%d", &L);
for (int i = 0; i < L; ++i)
{
int tmp;
scanf("%d", &tmp);
if(priority[tmp] > 0) v.push_back(priority[tmp]);
}
int maxSize = 0;
for (int i = 0; i < v.size(); ++i)
{
vector<int> ret;
dfs(v, i, ret, maxSize);
}
printf("%d", maxSize);
return 0;
}

本文探讨了深度优先搜索(DFS)在特定测试点上出现超时的问题,并提出使用动态规划作为替代方案来提高算法效率。通过分析,发现DFS在处理大规模数据时性能不佳,动态规划则能有效避免重复计算,提升求解最大子序列问题的速度。

204

被折叠的 条评论
为什么被折叠?



