刷题回顾指南
一、dfs
1.1n的全排列
# include <bits/stdc++.h>
using namespace std;
bool vis[ 10005 ] ;
int n;
int cnt;
int route[ 10005 ] ;
void dfs ( int u) {
if ( n == u) {
cnt++ ;
for ( int i= 0 ; i < n; i ++ ) cout << route[ i] << " " ;
cout << endl;
return ;
}
for ( int i = 1 ; i <= n; i++ ) {
if ( vis[ i] ) continue ;
vis[ i] = true ;
route[ u] = i;
dfs ( u + 1 ) ;
vis[ i] = false ;
}
}
int main ( ) {
cin >> n;
dfs ( 0 ) ;
cout << cnt << endl;
}
1.2 马走日
二、bfs
三、动态规划
class Solution {
public :
int climbStairs ( int n) {
int a = 1 , b = 1 , c;
if ( n < 2 ) return 1 ;
for ( int i = 1 ; i < n; i ++ ) {
c = a + b;
b = a;
a = c;
}
return c;
}
} ;
class Solution {
public :
int uniquePaths ( int m, int n) {
int dp[ 105 ] [ 105 ] ;
dp[ 0 ] [ 0 ] = dp[ 0 ] [ 1 ] = dp[ 1 ] [ 0 ] = 1 ;
for ( int i = 0 ; i < m; i ++ )
for ( int j = 0 ; j < n; j++ ) {
if ( i - 1 < 0 && j - 1 < 0 ) continue ;
if ( i - 1 < 0 ) dp[ i] [ j] = dp[ i] [ j - 1 ] ;
else if ( j - 1 < 0 ) dp[ i] [ j] = dp[ i - 1 ] [ j] ;
else dp[ i] [ j] = dp[ i] [ j - 1 ] + dp[ i - 1 ] [ j] ;
}
cout << dp[ n - 1 ] [ n - 1 ] << endl;
return dp[ m - 1 ] [ n - 1 ] ;
}
} ;
class Solution {
public :
int uniquePathsWithObstacles ( vector< vector< int >> & obstacleGrid) {
int dp[ 105 ] [ 105 ] ;
dp[ 0 ] [ 0 ] = 1 ;
int m = obstacleGrid. size ( ) ;
int n = obstacleGrid[ 0 ] . size ( ) ;
for ( int i = 0 ; i < m; i ++ ) {
for ( int j = 0 ; j < n; j++ ) {
if ( obstacleGrid[ i] [ j] == 1 ) {
dp[ i] [ j] = 0 ;
continue ;
}
if ( i - 1 < 0 && j - 1 < 0 ) continue ;
if ( i - 1 < 0 ) dp[ i] [ j] = dp[ i] [ j- 1 ] ;
else if ( j - 1 < 0 ) dp[ i] [ j] = dp[ i - 1 ] [ j] ;
else dp[ i] [ j] = dp[ i- 1 ] [ j] + dp[ i] [ j- 1 ] ;
}
}
return dp[ m- 1 ] [ n- 1 ] ;
}
} ;
四、最短路
五、最小生成树
六、并查集
# include <bits/stdc++.h>
using namespace std;
int p[ 10005 ] ;
void init ( int n) {
for ( int i = 1 ; i <= n; i ++ ) p[ i] = i;
}
int find ( int i) {
return ( p[ i] == i ? i : ( find ( p[ i] ) ) ) ;
}
void merge ( int a, int b) {
p[ find ( b) ] = find ( a) ;
}
int main ( ) {
int n, m, p;
cin >> n >> m >> p;
init ( n) ;
while ( m-- ) {
int a, b;
cin >> a >> b;
merge ( a, b) ;
}
while ( p-- ) {
int a, b;
cin >> a >> b;
cout << ( find ( a) == find ( b) ? "Yes" : "No" ) << endl;
}
return 0 ;
}
七、数学