深度優先搜尋 迭代加深搜尋 hdu 1560

2021-08-10 15:32:19 字數 856 閱讀 8154

這道題題意:從n個串中找出乙個最短的公共串(也許應該說序列吧,因為不要求連續,即只要保持相對順序就好)。

所謂迭代加深搜尋,就是限制dfs的深度,若搜不到答案,則加深深度,重新搜尋,這樣就防止了隨著深度不斷加深而進行的盲目搜尋,而且,對於這種求最短長度之類的題目,只要找到可行解,即是最優解了。同時注意剪枝,每次dfs的時候,都要判斷一下,當前的深度+最少還有加深的深度是否大於限制的長度,若是,則退回上一層狀態。

#include#include#include#include#include#include#include#include#include#define maxn 10

#define lson step<<1

#define rson step<<1|1

using namespace std;

char dna[4]=;

int n,deep,ans;

string s[maxn];

int max(int x,int y)

void dfs(int index,int len)

int maxx=0;//預計還要匹配的字串的最大長度

for(int i=0;ideep) //剪枝

return ;

if(maxx==0)//條件全部滿足即為最優解

for(int i=0;i<4;i++)

int pos[maxn];//記錄n個字串目前匹配到的位置

memset(pos,0,sizeof(pos));

while(1)

cout << ans << endl;

} return 0;

}

迭代加深搜尋

深度優先搜尋每次選定乙個分支,然後往下搜尋,直到遞迴邊界 才回溯。這種策略有一點缺陷,那就是當搜尋樹的分支數目特別 多,並且答案在某個較淺的節點上,如果dfs在一開始就選錯了分 支,那就會在沒有答案的深層次浪費時間 當搜尋樹規模隨著層次的深入增長很快,並且能 夠確保答案在乙個較淺的節點上時,就可以使...

迭代加深搜搜尋

對於可以用回溯法求解但解答樹的深度沒有明顯上限的題目,可以考慮使用迭代加深搜尋。經典問題 埃及分數問題 給出乙個分數,比如19 45,把它寫成若干個形如1 ri的分數的和的形式,比如19 45 1 5 1 6 1 18,要求分母不能重複使用並且使用的分數的個數最少。如果有多組個數相同的解,最後的分數...

IDDFS迭代加深搜尋

includeusing namespace std const int maxn 10 int n,a maxn bool ans sort return true int h bool dfs int d,int maxd return false int solve return max an...