时间复杂度
-最坏时间复杂度W(n)
-平均时间复杂度A(n)
实例I ∈ S的概率是 PI ,
A(n)=I∈S∑PI∗tI
基础算法
暴力
-五子棋对弈,5*5的棋盘上有多少种和棋的下法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| int mp[5][5]; long long sum = 0; void check() { int a = 0; for (int i = 0; i < 5; i++) { for (int j = 0; j < 5; j++) { if (mp[i][j] == 1) a++; } } if (a != 13) return; //此时满足13-12 int count = 0; count += mp[0][0] + mp[1][1] + mp[2][2] + mp[3][3] + mp[4][4]; if (count % 5 == 0) return; count = 0; count += mp[0][4] + mp[1][3] + mp[2][2] + mp[3][1] + mp[4][0]; if (count % 5 == 0) return; count = 0; for (int i = 0; i < 5; i++) { count += mp[i][0] + mp[i][1] + mp[i][2] + mp[i][3] + mp[i][4]; if (count % 5 == 0) return; count = 0; count += mp[0][i] + mp[1][i] + mp[2][i] + mp[3][i] + mp[4][i]; if (count % 5 == 0) return; count = 0; } //满足平局 sum++; } void dfs(int num) {//依次由从左往右,再到从上往下的顺序遍历 if (num == 25) {//棋盘下满 check(); return; } int x = num / 5, y = num % 5;//换算成坐标 mp[x][y] = 0; dfs(num + 1); mp[x][y] = 1; dfs(num + 1); } int main() { dfs(0);//从0开始,遍历所有结果 cout << sum << endl;//3126376 return 0; }
|
递归
二分
双指针
排序
分治
贪心
前缀和
差分
LCM
ST表
搜索
走迷宫
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| void bfs(vector<vector<int>>& map, int rx, int ry, vector<vector<int>>& ans) { queue<pair<int, int>> q; q.push({ rx, ry }); vector<vector<int>> directions = { {1,0} ,{0,1}, {-1,0}, {0,-1} }; ans[rx][ry] = 0; while (!q.empty()) { pair<int, int> p = q.front(); int x = p.first; int y = p.second; q.pop(); for (auto dir : directions) { if (x + dir[0] >= 0 && x + dir[0] < n && y + dir[1] >= 0 && y + dir[1] < m) { if (map[x + dir[0]][y + dir[1]] == 1) {//表示有路 if (ans[x + dir[0]][y + dir[1]] > ans[x][y] + 1) { ans[x + dir[0]][y + dir[1]] = ans[x][y] + 1; q.push({ x + dir[0],y + dir[1]}); } } } } } }
|