簡單搜尋
1.dfs
uva 548 樹
1.可以用陣列方式實現二叉樹,在申請結點時仍用「動態化靜態」的思想,寫newnode函式
2.給定二叉樹的中序遍歷和後序遍歷,可以構造出這棵二叉樹,方法是根據後序遍歷找到根,然後在中序遍歷中找到樹根,從而找出左右子樹的結點列表然後遞迴構造左右子樹
3.注意這裡輸入的模板,用stringstream會方便
#include#include2000提高組-c 單詞接龍#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;
}
用substr判斷能否接上
#include#include回溯 n皇后問題#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()
#include#includebfsbfs通常用佇列實現,開乙個vis陣列標記是否訪問過#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;
}
如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 表示用三...