不明白为什么动态编程在这里不起作用
Can't understand why Dynamic Programming isn't working here
我正在尝试从leetcode解决单词梯子问题。简而言之,它要求您编写代码,通过一次替换一个字母将一个单词转换为另一个单词,以便每个中间字符串也是一个单词。
我知道任何人都可以用BFS轻松解决它。但我认为动态规划(dp(技术在这里也可以工作。所以我正在尝试用dp来解决它。对于每个示例测试用例,它都可以正常工作。但是此代码对于大输入(系统判断(失败。.
现在我还不明白为什么 dp 在这里不起作用?
谁能给我一个小的输入,这失败了?您知道几乎不可能通过如此大的输入来测试此代码调试。
提前谢谢。
class Solution {
public:
vector<int> dp;
int n;
bool isOneDiff(string str1, string str2) {
if(str1.length() != str2.length()) return false;
int len = str1.length();
int cnt = 0;
for(int i = 0; i < len; i++) {
if(str1[i] != str2[i]) cnt++;
}
return cnt == 1;
}
int solve(string cur, int ind, const string endWord, vector<string> wordList) {
if(cur == endWord) return 1;
int &ret = dp[ind];
if(ret != -1) return ret;
ret = 100000000; // Infinity
for(int i = 0; i < n; i++) {
if(isOneDiff(cur, wordList[i])) {
ret = min(ret, 1 + solve(wordList[i], i, endWord, wordList));
}
}
return ret;
}
int ladderLength(string beginWord, string endWord, vector<string>& wordList) {
n = wordList.size();
dp.clear();
dp.resize(n+2, -1);
int res = solve(beginWord, n, endWord, wordList);
if(res >= 100000000) return 0; // if res is greater than or equal to infinity then I have to return 0
return res;
}
};
看起来您正在尝试记住DFS。 DFS在周期中会遇到麻烦,这也意味着在考虑非常短的解决方案之前,您必须探索可能很大的搜索空间。
顺便说一句,我不建议使用BFS来解决这个问题。 相反,我建议使用 A* 搜索。
相关文章:
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 为什么在保护模式下继承升级不起作用
- 循环在计数器中不起作用
- 在其他文件中创建类时在 c++ 项目中不起作用
- 为什么二进制搜索在我的测试中不起作用
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- STRCMP内部IF在内部不起作用
- 我的C++合并排序代码不起作用。我在这里错过了什么?
- C++ 互斥锁可以交叉方法/变量吗?如果是这样,为什么在这里不起作用?
- 不明白为什么动态编程在这里不起作用
- 复杂的regex_match在C++不起作用
- 为什么我的打开菜单在C++不起作用
- 为什么速记符号在课外不起作用?
- 为什么断言在这里不起作用
- 视觉 杀死入侵者在C++不起作用
- C++多态性/虚拟函数在此不起作用
- 为什么 [] 的重载函数在这里不起作用?
- 为什么glDrawPixel在这里不起作用
- 读取和写入文件在C++不起作用
- OpenCV C++ 在捕获不起作用时不会返回 false