public int PalindromePartition(string s, int k) { ProbInfo[,] probInfos = new ProbInfo[s.Length, k + 1]; PalindromeInfo[,] palindromeInfos = new PalindromeInfo[s.Length, s.Length]; return(PalindromePartitionAux(0, k, s, probInfos, palindromeInfos)); }
private int PalindromePartitionAux(int index, int k, string s, ProbInfo[,] probInfos, PalindromeInfo[,] palindromeInfos) { if (k == 0) { return(0); } if (probInfos[index, k] != null) { return(probInfos[index, k].Result); } probInfos[index, k] = new ProbInfo(); int result = int.MaxValue; if (k == 1) { result = MiniPalindrome(index, s.Length - 1, s, palindromeInfos); } else { int maxIndex = s.Length - 1 - (k - 1); for (int j = index; j <= maxIndex; j++) { var currentResult = MiniPalindrome(index, j, s, palindromeInfos); currentResult += PalindromePartitionAux(j + 1, k - 1, s, probInfos, palindromeInfos); if (currentResult < result) { result = currentResult; } } } probInfos[index, k].Result = result; return(result); }