目录
- 1.奇数位丢弃
- 1.题目链接
- 2.算法原理详解 && 代码实现
- 2.求和
- 1.题目链接
- 2.算法原理详解 && 代码实现
- 3.计算字符串的编辑距离
- 1.题目链接
- 2.算法原理详解 && 代码实现
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;}// DPfor(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; }
-