-2
私は正確に(十分に速くはないが)を評価され、私はなぜ私のシンプルなキャッシュが機能しないのですか?
private int CountChangeOptions(int[] coins, int j, int N)
{
if(j == 0)
return 0;
if(N == 0)
return 1;
if(j == 1)
return N % coins[0] == 0 ? 1 : 0;
int sum = 0;
int k = coins[j - 1];
for(int i = N; i >= 0; i -= k)
{
sum += CountChangeOptions(coins, j - 1, i);
}
return sum;
}
を書いたコードの塊を持っています。最もcoins
ためCountChangeOptions(coins, x, y)
ので、アルゴリズムの過程でy
、同じx
で数回呼び出されるだろう、私はキャッシュ戦略_cache
が以前_cache = new int[N+1, N+1]
に設定されているint?[][]
ある
private int CountChangeOptions(int[] coins, int j, int N)
{
if(j == 0)
return 0;
if(N == 0)
return 1;
if(j == 1)
return N % coins[0] == 0 ? 1 : 0;
int sum = 0;
int k = coins[j - 1];
for(int i = N; i >= 0; i -= k)
{
sum += CountOrGetFromCache(coins, j - 1, i);
}
return sum;
}
private int CountOrGetFromCache(int[] coins, int j, int i)
{
if(_cache[j, i] == null)
{
_cache[j, i] = CountChangeOptions(coins, j, i);
}
return (int)_cache[j, i];
}
を実施することを決定しました。しかし、これは現在いくつかのテストケースで失敗しています。どんな考え?私が見
どの入力用に間違った出力が得られますか?あなたはこれをデバッグしようとしましたか?ああ、あなたはより記述的な変数名を使いたいかもしれません - 'j'、' i'、 'N'、' k'のような名前は、アルゴリズムのバグを追跡する必要があるときにあまり役に立ちません。 –
'coins'配列が変更された場合、キャッシュされた値は無効になります。 –
'new [N + 1、N + 1]'を使って 'int [[] []'をどのように初期化していますか?その結果、私のためにエラーが発生します: '暗黙的に型int [*、*] 'を' int [[] [] ''に変換できません。 '_cache'の宣言とそれをどのように正確に初期化してくださいか? –