C++での特定の文字列の最大重み変換
AとBのみで構成される文字列があるとします。任意の文字を切り替えることで、指定された文字列を別の文字列に変換できます。したがって、与えられた文字列の多くの変換が可能です。タスクは、最大の重み変換の重みを見つけることです。
刺し傷の重さは、以下の式を使用して計算されます-
Weight of string = Weight of total pairs + weight of single characters - Total number of toggles.
-
2つの連続する文字は、異なる場合にのみペアと見なされます。
-
単一のペアの重み(両方の文字が異なります)=4
-
1文字の太さ=1
-
指定された文字列の変換は、「AA」、「AB」、「BA」、および「BB」です。
-
最大ウェイト変換は「AB」または「BA」です。そして、重量は「1ペア-1トグル」=4-1=3です。
アルゴリズム
1. If (n == 1) maxWeight(str[0..n-1]) = 1 2. Else If str[0] != str[1] maxWeight(str[0..n-1]) = Max (1 + maxWeight(str[1..n-1]), 4 + getMaxRec(str[2..n-1]) 3. Elses maxWeight(str[0..n-1]) = Max (1 + maxWeight(str[1..n-1]), 3 + getMaxRec(str[2..n-1])
例
#include<bits/stdc++.h> using namespace std; int getMaxRec(string &str, int i, int n, int lookup[]){ if (i >= n) { return 0; } if (lookup[i] != -1) { return lookup[i]; } int ans = 1 + getMaxRec(str, i + 1, n, lookup); if (i + 1 < n) { if (str[i] != str[i+1]) { ans = max(4 + getMaxRec(str, i + 2, n, lookup), ans); } else { ans = max(3 + getMaxRec(str, i + 2, n, lookup), ans); } } return lookup[i] = ans; } int getMaxWeight(string str){ int n = str.length(); int lookup[n]; memset(lookup, -1, sizeof lookup); return getMaxRec(str, 0, str.length(), lookup); } int main(){ string str = "AA"; cout << "Result = " << getMaxWeight(str) << endl; return 0; }
Result = 3
-
特定の文字列がC++の回文の回転であるかどうかを確認します
ここでは、特定の回転後の1つのストリングが回文であることがわかります。回文は、両方向で同じ文字列です。それがAAAADのようなものである場合、弦の回転は回文です。これは直接の回文ではありませんが、そのローテーションAADAAは回文です。 文字列が回文で回転しているかどうかを確認するには、最初にこれが回文であるかどうかを確認し、その後、1文字ずつ回転させてから、もう一度確認します。この確認はn回実行されます。ここでnは文字数です。 例 #include <iostream> #include <string> #include <algorithm> usi
-
C++で指定された製品のN個の整数の最大GCD
2つの整数NとPがあるとします。PはN個の未知の整数の積です。これらの整数の可能な最大GCDを見つける必要があります。 N =3、P =24とすると、異なるグループは{1、1、24}、{1、2、12}、{1、3、8}、{1、4、6}、{2 、2、6}、{2、3、4}。 GCDは1、1、1、1、2、1です。したがって、ここで答えは2です。 Pのすべての素因数を見つけて、ハッシュマップに保存します。素因数がすべての整数で共通である場合、N個の整数の最大公約数は最大GCDになります。したがって、P =p 1の場合 k1 * p 2 k2 *…*p n kn 。ここで、piは素因