无法理解为什么动态编程在这里不起作用

时间:2019-07-25 19:28:20

标签: c++ algorithm dynamic-programming memoization dfs

我正在尝试从 leetcode 解决Word Ladder问题。简而言之,它要求您编写通过一次替换一个字母将一个单词转换为另一个单词的代码,这样每个中间字符串也是一个单词。

我知道任何人都可以使用 BFS 轻松解决它。但是我认为动态编程(dp)技术也可以在这里使用。因此,我尝试使用 dp 解决此问题。对于每个样本测试用例,它都可以正常工作。但是对于大量输入,此代码将失败(系统判断)。

现在我仍然不明白为什么 dp 在这里不起作用?

如果失败,有人可以给我一点点输入吗?您知道几乎不可能通过this大输入来测试此代码调试。

谢谢。

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;
    }
};

1 个答案:

答案 0 :(得分:2)

您似乎想记住DFS。 DFS会在周期上遇到麻烦,这也意味着您必须考虑一个非常大的搜索空间,然后才能考虑非常短的解决方案。

偶然地,我不建议使用BFS解决此问题。相反,我建议使用A *搜索。