"String reduction"の問題をinterviewstreet.comから解決するには、さまざまな議論やコードの試みが見られましたが、いずれも動的プログラミングではありません。 Dynamic Programmingセクションの下にリストされている"string reduction"チャレンジの解決
次のように、問題が記述されている:
、b、cの年代からなる文字列を考えると、我々は以下の操作を行うことができます任意の2つの隣接の異なる文字を取り、それを置き換えます3番目の文字と一緒に。たとえば、 'a'と 'c'が隣接している場合、 'b'で置き換えることができます。
をこの操作を適用することによって生じる最小の文字列は何ですか?
問題が効果的にすべての可能な置換のツリーを作成し、徹底的力まかせ探索を使用して解決することができます。
// this is more or less pseudo code from my head
int GetMinLength(string s)
{
// solve edge cases
if (s.Length == 1) return 1;
if (s.Length == 2) return ReduceIfPossible(s);
// recursive brute force
int min = s.Length;
for (int i = 0; i<s.Length-1; i++)
{
if (s[i] != s[i+1])
{
var next = GetMinLength(
s.Substring(0, i) +
Reduce(s[i], s[i + 1]) +
s.Substring(i + 2)
);
if (next < min) min = next;
}
}
}
これは明らかに(N <= 100
)N
大きなために失敗したので、私は破るしようとしていますそれを小さなサブ問題に分解し、それらをメモし、結果をマージします。
問題は、動的プログラミング(つまり、サブ問題の結果を「マージ」する)を適用するために必要な"optimal substructure"の状態を判断できないという問題です。文字列の一部を最小限にしても、最終的な文字列が本当に最小の解決方法になるという保証はありません。
この場合、サブソリューション「状態」は最終的な解決策に統合される可能性がありますか?
@Dilbert。しかし、ネストしたルックアップを作成してください。あなたはあるものから別のものへルックアップすることができます。 (この表は、文字列の最後から開始して逆順に処理することで簡単に生成できます) – btilly
最初の手順をもう少し明確にしてください。 3文字のうちの1つに減らすことができる問題の文字列以下のすべてのブロックのテーブルを作成したいと思う。しかし、あなたは何を意味するのですか?「キャラクターによって、あなたは出発ポジションで終わりますか?」私はDPのノブです。 – gautam1168
@ gautam1168私は私が言ったことを正確に意味しました。 :-)最後の文字と開始位置が与えられると、その開始位置からその終点まで崩壊してその文字で終わることができる範囲のすべての終点のリストが必要です。これには、各問題点を解決するためのDP問題を解決する必要があります。 (参考にすると、範囲のマージが多く必要になります) "priority queue"を参考にして助けてください。 – btilly