// A Dynamic Programming based program to find minimum number
// insertions needed to make a string palindrome
#include <stdio.h>
#include <string.h>
// A utility function to find minimum of two integers
int min(int a, int b)
{ return a < b ? a : b; }
// A DP function to find minimum number of insersions
int findMinInsertionsDP(char str[], int n)
{
// Create a table of size n*n. table[i][j] will store
// minumum number of insertions needed to convert str[i..j]
// to a palindrome.
int table[n][n], l, h, gap;
// Initialize all table entries as 0
memset(table, 0, sizeof(table));
// Fill the table
for (gap = 1; gap < n; ++gap)
for (l = 0, h = gap; h < n; ++l, ++h)
table[l][h] = (str[l] == str[h])? table[l+1][h-1] :
(min(table[l][h-1], table[l+1][h]) + 1);
// Return minimum number of insertions for str[0..n-1]
return table[0][n-1];
}
// Driver program to test above function.
int main()
{
char str[] = "999";
printf("%d", findMinInsertionsDP(str, strlen(str)));
return 0;
}
Ly8gQSBEeW5hbWljIFByb2dyYW1taW5nIGJhc2VkIHByb2dyYW0gdG8gZmluZCBtaW5pbXVtIG51bWJlcgovLyBpbnNlcnRpb25zIG5lZWRlZCB0byBtYWtlIGEgc3RyaW5nIHBhbGluZHJvbWUKI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KIAovLyBBIHV0aWxpdHkgZnVuY3Rpb24gdG8gZmluZCBtaW5pbXVtIG9mIHR3byBpbnRlZ2VycwppbnQgbWluKGludCBhLCBpbnQgYikKeyAgIHJldHVybiBhIDwgYiA/IGEgOiBiOyAgfQogCi8vIEEgRFAgZnVuY3Rpb24gdG8gZmluZCBtaW5pbXVtIG51bWJlciBvZiBpbnNlcnNpb25zCmludCBmaW5kTWluSW5zZXJ0aW9uc0RQKGNoYXIgc3RyW10sIGludCBuKQp7CiAgICAvLyBDcmVhdGUgYSB0YWJsZSBvZiBzaXplIG4qbi4gdGFibGVbaV1bal0gd2lsbCBzdG9yZQogICAgLy8gbWludW11bSBudW1iZXIgb2YgaW5zZXJ0aW9ucyBuZWVkZWQgdG8gY29udmVydCBzdHJbaS4ual0KICAgIC8vIHRvIGEgcGFsaW5kcm9tZS4KICAgIGludCB0YWJsZVtuXVtuXSwgbCwgaCwgZ2FwOwogCiAgICAvLyBJbml0aWFsaXplIGFsbCB0YWJsZSBlbnRyaWVzIGFzIDAKICAgIG1lbXNldCh0YWJsZSwgMCwgc2l6ZW9mKHRhYmxlKSk7CiAKICAgIC8vIEZpbGwgdGhlIHRhYmxlCiAgICBmb3IgKGdhcCA9IDE7IGdhcCA8IG47ICsrZ2FwKQogICAgICAgIGZvciAobCA9IDAsIGggPSBnYXA7IGggPCBuOyArK2wsICsraCkKICAgICAgICAgICAgdGFibGVbbF1baF0gPSAoc3RyW2xdID09IHN0cltoXSk/IHRhYmxlW2wrMV1baC0xXSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgKG1pbih0YWJsZVtsXVtoLTFdLCB0YWJsZVtsKzFdW2hdKSArIDEpOwogCiAgICAvLyBSZXR1cm4gbWluaW11bSBudW1iZXIgb2YgaW5zZXJ0aW9ucyBmb3Igc3RyWzAuLm4tMV0KICAgIHJldHVybiB0YWJsZVswXVtuLTFdOwp9CiAKLy8gRHJpdmVyIHByb2dyYW0gdG8gdGVzdCBhYm92ZSBmdW5jdGlvbi4KaW50IG1haW4oKQp7CiAgICBjaGFyIHN0cltdID0gIjk5OSI7CiAgICBwcmludGYoIiVkIiwgZmluZE1pbkluc2VydGlvbnNEUChzdHIsIHN0cmxlbihzdHIpKSk7CiAgICByZXR1cm4gMDsKfQ==