算法提高课-搜索-DFS之搜索顺序-AcWing 1117. 单词接龙:dfs
生活随笔
收集整理的這篇文章主要介紹了
算法提高课-搜索-DFS之搜索顺序-AcWing 1117. 单词接龙:dfs
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目分析
來源:acwing
分析:外部dfs,需要狀態恢復。
字符串a的后k的字母 和字符串b的前k個字母是否相同,用substr函數判斷:if(a.substr(a.size() - k, k) == b.substr(0,k))
ac代碼
#include<bits/stdc++.h> using namespace std; const int N = 30; int n; string words[N]; bool st[N][N]; int used[N];// 每個單詞用多少次 int g[N][N];// 兩個單詞重疊部分長度的最小值 int ans; // 全局變量存的是結果//暴搜,求單詞接龍的長度 // 龍,上一個單詞的編號 void dfs(string dragon, int last){ans = max((int)dragon.size(), ans);// 長度取最大值used[last] ++; // 用一次次數++for(int i = 0; i < n; i ++)// last--> i這個單詞可以連if(g[last][i] && used[i] < 2)// 這里substr(g[last][i])就是重疊部分后面的字符dfs(dragon + words[i].substr(g[last][i]), i);used[last] --;//回溯} int main(){cin >> n;for(int i = 0; i < n; i ++) cin >> words[i];char start;cin >> start;// 預處理,任意兩個單詞之間重疊的部分,存在g[][]數組中,存的是重疊部分的長度for(int i= 0; i < n; i ++)for(int j = 0; j < n; j ++){string a = words[i], b = words[j];for(int k = 1; k < min(a.size(), b.size()); k ++)if(a.substr(a.size() - k, k) == b.substr(0,k)){g[i][j] = k;break;}}// 從起始字母開始dfs,從words[i]這個單詞開始搜,當前用到的是第i個單詞for(int i = 0; i< n; i ++){if(words[i][0] == start)dfs(words[i], i);}cout << ans << endl;}題目來源
https://www.acwing.com/problem/content/1119/
總結
以上是生活随笔為你收集整理的算法提高课-搜索-DFS之搜索顺序-AcWing 1117. 单词接龙:dfs的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法提高课-搜索-DFS之搜索顺序-Ac
- 下一篇: 算法提高课-图论-单源最短路的建图方式-