給定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,但是總是超時,這次終...