dfs 剪枝 排書問題

2021-10-04 12:31:29 字數 1010 閱讀 4731

給定n本書,編號為1-n。

在初始狀態下,書是任意排列的。

在每一次操作中,可以抽取其中連續的一段,再把這段插入到其他某個位置。

我們的目標狀態是把書按照1-n的順序依次排列。

求最少需要多少次操作。

輸入格式

第一行包含整數t,表示共有t組測試資料。

每組資料報含兩行,第一行為整數n,表示書的數量。

第二行為n個整數,表示1-n的一種任意排列。

同行數之間用空格隔開。

輸出格式

每組資料輸出乙個最少操作次數。

如果最少操作次數大於或等於5次,則輸出」5 or more」。

每個結果佔一行。

資料範圍

1≤n≤15

輸入樣例:36

1 3 4 6 2 5

55 4 3 2 1

106 8 5 3 4 7 2 9 1 10

輸出樣例:23

5 or more

解題報告:這道題要用dfs做,用估價函式a*來剪枝,我們不難發現出,n個數字最後的排序是對應n-1個關係對 1——2 2——3…我們每次把一整塊連續的書插入到後面時,最多改變3個關係,所以我們可以求出不正確的關係的數量再/3上取整,dfs搜尋有兩個引數,乙個是當前的深度,和最大的深度,我們來列舉最大深度的大小,如果不滿足return false。

#include

#include

#include

using

namespace std;

const

int n=16;

int q[n]

;int w[5]

[n];

int n;

intf()

bool

dfs(

int u,

int max_depth)

}return

false;}

intmain()

return0;

}

揹包問題(dfs剪枝優化)

時間複雜度指數級 剪枝操作確實可以減去數倍的計算時間 clock t start1,finish1,start2,finish2 double duration1,duration2 const int maxn 40 int n,v,maxvalue 0 物品件數,揹包容量,最大價值 int w ...

DFS之剪枝 尋路問題

2.用mid k m 表示 走到城市k時總過路費為m的條件下,最優路徑的長度。若在後續的搜尋中,再次走到k時,如果總路費恰好為m,且此時的最優長度已經超過mid k m 則不必再走下去了。include include include using namespace std int k,n,r st...

搜尋剪枝DFS

tempter of the bone hdu1010 題意 給乙個圖,找出乙個看能否能在t的時間內從s到達d點 思路 bfs肯定不行,因為bfs找到的是最短時間的路徑,無法對在t時間點到達d點進行判斷 於是才想到了dfs,這個能把所有的情況遍歷一遍的演算法,雖然圖的長寬只有7,但是總是超時,這次終...