// Find maximum palindromic subsequence of the given string
public class MaxPalindrome {
	public static String maxPalindrome(String p) {
		int n = p.length();
		char[] s = p.toCharArray();
		int[][] dp = new int[n + 1][n + 1];

		for (int i = 0; i <= n; i++) {
			dp[i][0] = dp[0][i] = i;
		}

		for (int i = 0; i < n; i++) {
			for (int j = 0; j < n - 1 - i; j++) {
				dp[i + 1][j + 1] = (s[i] == s[n - 1 - j]) ? dp[i][j] : Math.min(dp[i][j + 1] + 1, dp[i + 1][j] + 1);
			}
		}

		int min = n;
		int x = 0;
		int y = n;
		for (int i = 0; i <= n; i++) {
			if (min > dp[i][n - i]) {
				min = dp[i][n - i];
				x = i;
				y = n - i;
			}
		}

		String middle = "";
		for (int i = 0; i < n; i++) {
			if (min > dp[i][n - i - 1]) {
				min = dp[i][n - i - 1];
				x = i;
				y = n - i - 1;
				middle = "" + s[i];
			}
		}

		String res = "";

		while (x > 0 && y > 0) {
			int a = dp[x - 1][y - 1];
			int b = dp[x - 1][y];
			int c = dp[x][y - 1];
			int m = Math.min(a, Math.min(b, c));
			if (a == m) {
				res += s[x - 1];
				--x;
				--y;
			} else if (b == m) {
				--x;
			} else {
				--y;
			}
		}

		return new StringBuilder(res).reverse() + middle + res;
	}

	// Usage example
	public static void main(String[] args) {
		String res = maxPalindrome("3213");
		System.out.println("323".equals(res));
	}
}
