dfs 剪枝(暑假集訓第三週周測E)

2021-08-06 04:34:47 字數 1441 閱讀 5846

☝題目dfs題目,但是感覺上就可能會超時。所以加了兩個很巧妙的剪枝優化。

嚶嚶嚶,**過會兒補上,現在有點心累,不想動。

好的,一會兒以後就是一天之後,我寫完了**!

#include

using

namespace

std;

int n, s;//奇異數列的長度和奇異數列的和

int pr[30];

//int sum = 0;

int flag;

void dfs(int step,int num,int sum)

int s1 = (num + 1 + num + n - step)*(n - step) / 2;//剪枝2

int s2 = (num - 1 + num - n + step)*(n - step) / 2;//同為剪枝2

if (sum + s1s)

return;

dfs(step + 1, num - 1,sum);

dfs(step + 1, num + 1,sum);

}int main()

//剪枝1

if ((n / 2) % 2 == 1 && s % 2 == 0)

//同為剪枝1

dfs(1, 0,0);

flag ? cout

<< "" : cout

<< "impossible!\n";

}return

0;}

好的,現在我們來把程式跑一下,最近我迷上了腦動跑程式,感覺跑完一遍就會清晰一些,但是有乙個blog主說像dfs、遞迴這種的區域性分析比較好,總體跑就容易把自己繞進去,那我也不知道了。

假設我們輸入的是4,0。

輸出的應該是:0 -1 0 1, 0 1 0 -1。

進入程式之後dfs(1,0,0),然後進入dfs(2,-1,0),sum此時變成-1,進入dfs(3,-2,-1),在s1的剪枝中被return,進入dfs(3,0,-1),此時sum為-1,然後進入dfs(4,-1,-1),此時sum=-2,被return掉,進入dfs(4,1,-1),sum=0,符合結果輸出一組合適的答案,進入dfs(2,1,0),然後sum=1,dfs(3,0,1),sum=1,進入dfs(4,-1,1),sum=0,輸出,進入dfs(4,1,1),sum=2,return掉,進入dfs(3,2,1),sum=3,return掉,結束。

下面看一下dfs的整體流程,先是賦值,然後判斷,先判斷是否符合輸出結果的要求,此時可以輸出結果,然後進入是否超出條件的判斷,然後進入遞迴。

最重要的就是找準dfs的引數的個數和意義,其次就是各種判斷的條件。

在這道題中,sum這個值不是整體變數,而是作為乙個遞迴的量,一直在變化!

真神奇!

暑假第三週

第三週安裝hadoop,教程原址 在建立hadoop新使用者時,輸入密碼是不會顯示的,在這裡我以為出現了問題,其實這是正常的,之後使用sudo apt get install vim命令安裝了vim編輯器,並學會了基本操作用法,教程原址 基本操作 需要鍵盤敲擊輸入乙個英文本母i,進入編輯狀態以後才能...

暑假第三週

一.學習 這一周學到的東西並不多,就是一直再趕我們之前的專案,一直在完善。說是完善,不如說是再寫一遍,因為我們的專案的前台頁面不美觀,而且顏色搭配不好看。所以一直在作頁面,前端兩個人,有的頁面還沒寫完,有的頁面功能還沒有實現。到最後,搞得我們也不知道哪乙個是完整的頁面了,效率比較低。在 其他組寫的時...

集訓第三週

又要感嘆時間過得真快了,8月13號,距離第一場網路賽還有26天。暑假三周集訓結束,個人賽也結束了,這一周還是做了一些個人賽,然後組好了隊伍。去年一隊有2個人算是 實力超群 比其餘人都高乙個檔次。而今年大家的水平都差不多,沒有像去年他們那麼突出,實力自然有不小的下降。相比去年的隊伍,今年隊的特點是大家...