------
## 最终结论
```python
def min_changes_to_palindrome_substrings(s: str, k: int) -> int:
    n = len(s)
    # Initialize a 2D array to store the minimum changes required to make substrings palindrome
    dp = [[0] * n for _ in range(n)]
    
    # Fill the dp array with the number of changes needed for each substring
    for length in range(2, n + 1):  # length of substring
        for start in range(n - length + 1):
            end = start + length - 1
            if s[start] != s[end]:
                dp[start][end] = dp[start + 1][end - 1] + 1
            else:
                dp[start][end] = dp[start + 1][end - 1]

    # Initialize a DP array to store the minimum changes needed to split into k palindromic substrings
    min_changes = [[float('inf')] * (k + 1) for _ in range(n)]
    
    for j in range(1, k + 1):  # number of palindromic substrings
        for i in range(n):  # end index of the string
            if j == 1:
                min_changes[i][j] = dp[0][i]  # only one substring from start to i
            else:
                for p in range(i):  # split point
                    min_changes[i][j] = min(min_changes[i][j], min_changes[p][j - 1] + dp[p + 1][i])

    return min_changes[n - 1][k]

# Example usage:
print(min_changes_to_palindrome_substrings("abc", 2))   # Output: 1
print(min_changes_to_palindrome_substrings("aabbc", 3)) # Output: 0
print(min_changes_to_palindrome_substrings("leetcode", 8)) # Output: 0
```