uva529 迭代加深 必要剪枝

2021-06-29 03:32:28 字數 929 閱讀 6805

//

// main.cpp

// 529

//// created by fangpin on 15/3/14.

//#include #include using namespace std;

int a[10005]=,n;

bool ok;

void dfs(int limit,int d)

}}int main(int argc, const char * argv) }}

}return 0;

}

題目大意:

給乙個數字n, 然後輸出乙個元素個數最少的從1到n的序列(可能有多種方案,輸出其中一種即可)。

其中對於第k個數ak, 它的值等於ai+aj( ) 。

分析與總結:

這一題是典型的迭代加深搜尋+減枝的題目。

迭代加深的搜尋(ids,iterative deepening search):

迭代加深搜尋,實質上就是限定下界的深度優先搜尋。即首先允許深度優先搜尋k層搜尋樹,若沒有發現可行解,再將k+1後重複以上步驟搜尋,直到搜尋到可行解。

在迭代加深搜尋的演算法中,連續的深度優先搜尋被引入,每乙個深度約束逐次加1,直到搜尋到目標為止。

迭代加深搜尋演算法就是仿廣度優先搜尋的深度優先搜尋。既能滿足深度優先搜尋的線性儲存要求,又能保證發現乙個最小深度的目標結點。

從實際應用來看,迭代加深搜尋的效果比較好,並不比廣度優先搜尋慢很多,但是空間複雜度卻與深度優先搜尋相同,比廣度優先搜尋小很多。

對於這一題,首先可以求出最少需要幾個元素可以達到n。按照貪心的策略,對於每個元素的值,都選擇讓它等於乙個數的兩倍,即對於每個ai = ai-1 + ai-1, 當ai>=n時就跳出迴圈,得到最少元素個數。

然後從最少步數開始迭代加深搜尋。 然後再用上一些減枝技巧即可。

翻煎餅 迭代加深搜尋 剪枝

這裡有道類似的 題目 使用迭代搜尋,最多只能跑過 n 7 n 7n 7 的資料,需要剪枝,每次旋轉相鄰數字之間的差值變化最微小,翻轉一次僅有一對數字間的差的絕對值會發生改變,於是統計有cnt cntcn t數字間絕對值不為 1 11,則至少需要 cnt cntcn t 次操作到終態,依此進行剪枝 沒...

UVA 1374 迭代加深搜尋

所謂迭代加深搜尋實質 限制每一次所搜的最大深度,然後進行dfs深搜,並且我們可以利用節點深度的性質來進行剪枝來優化演算法,這個題中 由於深度固定,我們在當前層數上指數是a,最大深度為maxd,當前深度為cur,那麼我們接下來幾層向下深搜最大只會到達a maxd cur 以你為向下一層最大就是指數的二...

codevs1288 埃及分數 迭代加深 剪枝

在古埃及,人們使用單位分數的和 形如1 a的,a是自然數 表示一切有理數。如 2 3 1 2 1 6,但不允許2 3 1 3 1 3,因為加數中有相同的。對於乙個分數a b,表示方法有很多種,但是哪種最好呢?首先,加數少的比加數多的好,其次,加數個數相同的,最小的分數越大越 好。如 19 45 1 ...