C++で2つの数値文字列を同一にするための最小コスト
2つの数値文字列AとBがあるとします。AとBを同一にするための最小コストを見つける必要があります。実行できる操作は1つだけです。つまり、文字列から数字を削除できます。数値から数字を削除するためのコストは、数字の値と同じです。文字列A=“ 6789”、B =“ 7859”とすると、Aから6を削除し、Bから5を削除する必要があるため、コストは5 + 6=11になります。
これは最長共通部分列問題のバリエーションの1つです。 AとBからLCSの長さを見つける必要があります。この式を使用することで、最小のコストを得ることができます。
MinimumCost =CostA + CostB−2 ∗ lcs cost
例
#include <iostream> using namespace std; int longest_common_subsequence(int dp[101][101], string a, string b, int a_len, int b_len) { for (int i = 0; i < 100; i++) for (int j = 0; j < 100; j++) dp[i][j] = -1; if (a_len < 0 || b_len < 0) { return 0; } if (dp[a_len][b_len] != -1) return dp[a_len][b_len]; int res = 0; if (a[a_len] == b[b_len]) { res = int(a[a_len] - 48) + longest_common_subsequence(dp, a, b, a_len - 1, b_len - 1); } else res = max(longest_common_subsequence(dp, a, b, a_len - 1, b_len), longest_common_subsequence(dp, a, b, a_len, b_len - 1)); dp[a_len][b_len] = res; return res; } int minCost(string str) { int cost = 0; for (int i = 0; i < str.length(); i++) cost += int(str[i] - 48); return cost; } int main() { string a, b; a = "6789"; b = "7859"; int dp[101][101]; cout << "Minimum Cost to make these two numbers identical: " << (minCost(a) + minCost(b) - 2 * longest_common_subsequence(dp, a, b, a.length() - 1, b.length() - 1)); return 0; }
出力
Minimum Cost to make these two numbers identical: 11
-
C++で2つの文字列を同一にするための最小コスト
2つの文字列AとBがあり、CostAとCostBのような別の2つのコスト値があるとします。 AとBを同一にするための最小コストを見つける必要があります。文字列から文字を削除できます。文字列Aから削除するためのコストはCostAであり、文字列Bから削除するためのコストはCostBです。文字列からすべての文字を削除するコストは同じです。文字列A=“ wxyz”、B =“ wyzx”、CostAが10、CostBが20であると仮定します。したがって、出力は30になります。両方の文字列からxを削除すると、AとBは同じになります。したがって、コストは10 + 20=30です。 これは最長共通部分列問題
-
C++で文字を削除せずに2つの文字列アナグラムを作成するために必要な操作の最小数
同じ長さの2つの文字列があるとすると、文字を削除せずに、2つの文字列のアナグラムを作成するために必要な最小限の変更を見つける必要があります。アナグラムは、同じ文字セットを持つ2つの文字列です。 2つの文字列が「HELLO」であり、ここで「WORLD」が必要な変更の数が3であると仮定します。この場合、3つの文字が異なります。 考え方は単純です。最初の文字列の各文字の頻度を見つけてから、2番目の文字列を調べ、2番目の文字列の文字が周波数配列に存在する場合は、頻度の値を減らします。頻度の値が0未満の場合は、最終カウントを1増やします。 例 #include <iostream> usi