これは Topcoder SRM 566 Div2 のアルゴリズムの問題です。
問題はここで見ることができます。
トップコーダーアカウントを持っていない人のために、問題を以下に説明します:
Penguin Pals(ペンギンパルズ)は、以下の手順でペンギン同士をマッチングするマッチングサービスです。
- 各ペンギンには、「青と赤のどちらが好きですか?」という 1 つの質問がされます。
- すべてのペンギンは、等間隔で円の上に立つように配置されています。
- 主催者は、いくつかのペアのペンギンを結ぶ直線をいくつか描きます。各ペンギンは、最大 1 つの他のペンギンとしか接続できません。ペンギンが違う色を好む場合、2 匹のペンギンを接続することはできません。
- 他のペンギンに接続されている各ペンギンは、一致するものを見つけるために線をたどります。
上記のシステムの唯一の問題は、2 本の線が交差するとペンギンが衝突してしまうことでした。したがって、新しい追加ルールが採用されました。2 つの線が交差してはなりません。Penguin Pals には、いくつかのペンギンが円上に配置されています (上記の手順のステップ 2 の後)。作成できるペンギンのペアの最大数を知る必要があります。
円形配置で i 番目の文字が i 番目のペンギン (0 から始まるインデックス) の好みの色を表す文字列の色が与えられます。i 番目のペンギンが赤を好む場合、i 番目の文字は 'R' であり、i 番目のペンギンが青を好む場合は 'B' です。形成できる一致したペアの最大数を返します。
例:
"RRBRBRBB"
リターン: 3
"BBBB"
リターン: 2
「RRRBRBRBRBRB」
リターン: 5
私のアプローチ:
長さ n の文字列 s を呼び出します。(0 番目と n-1 番目のインデックスは連続していることに注意してください)。
次のような再帰関数 recurse(string s,int i,int j) を使用しました。
int recurse(string s,int i,int j)
{
if(i>=j)
return 0;
if(s[i]==s[j])
return(1+recurse(s,i+1,j-1));
else return max(recurse(s,i,j-1),recurse(s,i+1,j));
}
i=0 と j=n-1 から始めます。どちらも等しい場合は連続するため、(i+1,j-1) で関数を呼び出します。そうでない場合は、両方の可能性を考慮して関数 recurse を呼び出します。 (s,i,j-1) および recurse(s,i+1,j) であり、これら 2 つの最大値を取ります。
考えられるすべての開始ペアに対してこの関数を呼び出しました。
入力「RRRBRRBB」の場合。
入力を使用して関数 recurse() を呼び出しました。
- s="RRRBRRBB" i=0 j=n-1
- s="RRBRRBBR" i=0 j=n-1 (文字列を左に移動し、以前の左端が右端になりました)
- s="RBRRBBRR" i=0 j=n-1 (同じ操作)
すべてのケースがカバーされるまで続きます。
しかし、私は WA を取得しましたが、なぜそれが機能しないのか、私のアプローチの欠陥を特定できませんでした。