HZNU ACM寒假集訓Day3小結 搜尋

2022-06-13 16:00:13 字數 4098 閱讀 3618

簡單搜尋

1.dfs

uva 548 樹

1.可以用陣列方式實現二叉樹,在申請結點時仍用「動態化靜態」的思想,寫newnode函式 

2.給定二叉樹的中序遍歷和後序遍歷,可以構造出這棵二叉樹,方法是根據後序遍歷找到根,然後在中序遍歷中找到樹根,從而找出左右子樹的結點列表然後遞迴構造左右子樹

3.注意這裡輸入的模板,用stringstream會方便

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

const

int maxn = 1e6 + 5

;const

double pi = acos(-1.0

);typedef

long

long

ll;using

namespace

std;

const

int maxv = 10000 + 10

;int

in_order[maxv], post_order[maxv], lch[maxv], rch[maxv];

intn;

bool read_list(int*a)

int build(int l1, int r1, int l2, int

r2)

intbest, best_sum;

void dfs(int u, int

sum)

}if(lch[u]) dfs(lch[u], sum);

if(rch[u]) dfs(rch[u], sum);

}int

main()

return0;

}

2000提高組-c  單詞接龍  

用substr判斷能否接上

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

const

int maxn = 1e6 + 5

;const

double pi = acos(-1.0

);typedef

long

long

ll;using

namespace

std;

string s[25

];int vis[25

];int max=-1

;int

n;void dfs(string x, int

len)

}}int

main()

回溯    n皇后問題 

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

const

int maxn = 1e6 + 5

;const

double pi = acos(-1.0

);typedef

long

long

ll;using

namespace

std;

int x[15], y[15]; //

x[i]為第i行所在的列

intn1, ans;

bool place(int

k)

return

true

;}

//判斷位置是否可行

void dfs(int a)

}}int

main()

while (scanf("

%d", &n), n)

return0;

}

bfsbfs通常用佇列實現,開乙個vis陣列標記是否訪問過

如catch that cow    如果用dfs會tle,考慮dfs

#include#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

const

int maxn = 1e6 + 5

;const

double pi = acos(-1.0

);const

int n = 200100

;typedef

long

long

ll;using

namespace

std;

intn, k;

struct

node ;

queue

q;int

vis[n];

void

bfs()

if (x >= 1 && (!vis[x - 1

]))

if (x <= k && (!vis[x + 1

]))

if (x <= k && (!vis[x * 2

]))

}}int

main()

回溯法一般是要找到乙個(或者所有)滿足約束的解(或者某種意義下的最優解),而狀態空間搜尋一般是要找到乙個從初始狀態到終止狀態的路徑  

路徑尋找問題可以歸結為隱式圖的遍歷,它的任務是找到一條從初始狀態到終止狀態的最優路徑,而不像回溯法那樣找到乙個符合某些條件的解。

八數碼問題

#include#include

#include

using

namespace

std;

queue

q;mapvis;//

標記陣列

mapstep;//

記錄到這種狀態的步數

int dir[4][2]=;//

上,右,下,左

int mat[3][3

];int state;//

輸入的初始狀態

intr,c;

void input()//

輸入資料並將矩陣轉化為乙個九位整數

state=tmp;

}bool can_move(int u,int d)//

判斷是否可以走}}

//判斷四個方向是否能走

if((d==0&&r==0)||(d==1&&c==2)||(d==2&&r==2)||(d==3&&c==0

))

return0;

return1;

}int move_to(int u,int d)//

返回從狀態u走到的狀態

return

tmp;

}int bfs(int

s) }}}

return -1;}

intmain()

拓撲排序 

不包含有向環的有向圖稱為有向無環圖(dag),如果圖中存在有向環,則不存在拓撲排序

北京集訓DAY3

消去合法的序列 剩下的不合法序列一定是 3兩種括號個數各加1除2 手算一下即可4 5 include 6 include 7 include 8 9const int maxn 100010 10 11int len,top,cnt 1213 char s maxn 1415 inthh 25int...

HZNU ACM寒假集訓Day7小結 揹包DP

揹包問題 01揹包 狀態 f i,j 表示只能裝前i個物品的情況下,容量為j的揹包所能達到的最大總價值 狀態轉移方程 f i,j max f i 1,j f i 1,j w i v i 核心 滾動陣列 由於我們使用一維陣列儲存,則在求兩個子問題時沒有直接取出那麼方便了,因為第i次迴圈可能覆蓋第i 1...

省隊集訓DAY3

一共要使用六根木棍,那麼分割的方法就兩種,那麼關鍵就是要計算2,3的數量。cnt1 i 表示每種長度的木棍的方案數 cnt2 i 最初表示用不同的木棍拼成長度為i邊的方案數,後來表示選出四根木棍構成的方案數。cnt22 i 表示用兩個長度相同的不同木棍拼成長度為i的邊的方案數。cnt3 i 表示用三...