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は素因