最少操作数

给你一个数列,一次操作是指将某个数移到数列中别的位置上去,然后问最少要几次操作才能让数列变得有序。例如,数列7,1,3,2,6,5就只需要三次移动,把3移到2后面,把5移到6前面,再把7移到最后面即可。当时居然只有一个人想到,这题其实就是一个最长上升子序列问题。因为整个操作过程实质上可以等价地看作是,把要移动的数先全部取出来,再挨个放回适当的位置。这就要求取出要移动的数后,剩下的那些数本身是有序的。若希望要移动的数越少越好,那也就等于说是剩下的不动的数要越多越好。
要实现一个字符序列到另一个字符序列的转换,并计算最少的操作次数,可以使用动态规划算法。以下是一个可能的C++实现,它使用动态规划来解决这个问题: ```cpp #include <iostream> #include <vector> #include <string> #include <algorithm> int minDistance(std::string word1, std::string word2) { int len1 = word1.size(); int len2 = word2.size(); // 创建一个二维数组来存储中间结果,dp[i][j] 表示从 word1 的前 i 个字符转换到 word2 的前 j 个字符的最少操作数 std::vector<std::vector<int>> dp(len1 + 1, std::vector<int>(len2 + 1)); // 初始化边界条件 for (int i = 0; i <= len1; ++i) { dp[i][0] = i; // word2 为空字符串时,删除操作次数 } for (int j = 0; j <= len2; ++j) { dp[0][j] = j; // word1 为空字符串时,增加操作次数 } // 动态规划填表 for (int i = 1; i <= len1; ++i) { for (int j = 1; j <= len2; ++j) { if (word1[i - 1] == word2[j - 1]) { // 当前字符相同,不需要操作 dp[i][j] = dp[i - 1][j - 1]; } else { // 当前字符不同,需要进行一次操作(增加、删除或替换) dp[i][j] = std::min({dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]}) + 1; } } } // 最后的结果存储在 dp[len1][len2] 中 return dp[len1][len2]; } int main() { std::string word1 = "horse"; std::string word2 = "ros"; std::cout << "Minimum number of operations: " << minDistance(word1, word2) << std::endl; return 0; } ``` 这段代码中,`minDistance`函数计算了将`word1`转换为`word2`的最少操作次数。操作可以是增加一个字符、删除一个字符或更改一个字符。动态规划数组`dp`用来存储中间结果,其大小为`(len1 + 1) * (len2 + 1)`,其中`len1`和`len2`分别是两个字符串的长度。最后,`dp[len1][len2]`中存储的就是将`word1`转换为`word2`的最少操作数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值