1.奇数位丢弃
1.题目链接
2.算法原理详解 && 代码实现
-
解法:模拟 + 规律
#include <iostream> using namespace std; int main() { int n = 0; while(cin >> n) { int ret = 1; while(ret - 1 <= n) { ret *= 2; } cout << ret / 2 - 1 << endl; } return 0; }
2.求和
1.题目链接
2.算法原理详解 && 代码实现
-
解法:DFS型枚举
#include <iostream> using namespace std; int n = 0, m = 0; bool choose[11] = { false }; // 标记路径中选了哪些数 int sum = 0; // 标记已选数的总和 void DFS(int x) { if(sum == m) { for(int i = 1; i <= n; i++) { if(choose[i]) { cout << i << " "; } } cout << endl; return; } if(sum > m || x > n) { return; } // 选 sum += x; choose[x] = true; DFS(x + 1); sum -= x; choose[x] = false; // 不选 DFS(x + 1); } int main() { cin >> n >> m; DFS(1); return 0; }
3.计算字符串的编辑距离
1.题目链接
2.算法原理详解 && 代码实现
-
解法:二维线性动态规划
-
状态表示:
dp[i][j]
:字符串a
中[1, i]
区间以及字符串b
中[1, j]
区间内的编辑距离 -
状态转移方程:根据两个字符串此时的最后一个字符分析问题
-
返回值:
dp[n][m]
-
初始化:多加一行一列,用于表示空串
#include <iostream> #include <string> #include <vector> using namespace std; int main() { string a, b; cin >> a >> b; int n = a.size(), m = b.size(); vector<vector<int>> dp(n + 1, vector<int>(m + 1, 0)); for(int j = 0; j <= m; j++) { dp[0][j] = j; } for(int i = 0; i <= n; i++) { dp[i][0] = i; } // DP for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) { if(a[i - 1] == b[j - 1]) { dp[i][j] = dp[i - 1][j - 1]; } else { dp[i][j] = min(min(dp[i - 1][j], dp[i][j - 1]), dp[i - 1][j - 1]) + 1; } } } cout << dp[n][m] << endl; return 0; }
-