Загрузка данных


package main

import (
	"fmt"
)

func Valid(r rune) bool {
	if r == 'T' || r == 'O' || r == 'I' {
		return true
	}
	return false
}

func Min(a int, b int) int {
	if a >= b {
		return b
	}
	return a
}

func Compute(s string, dp [][]int, i int, j int) int {
	if i == j {
		if Valid(rune(s[i])) {
			return 0
		} else {
			return 1
		}
	} else if i + 1 == j {
		if Valid(rune(s[i])) {
			if Valid(rune(s[j])) {
				if s[i] == s[j] {
					return 0
				} else {
					return 1
				}
			} else {
				return 1
			}
		} else {
			if Valid(rune(s[j])) {
				return 1
			} else {
				return 2
			}
		}
	}

	if s[i] == s[j] {
		if Valid(rune(s[i])) {
			return dp[i + 1][j - 1]
		}
		return 2 + dp[i + 1][j - 1]
	}

	if Valid(rune(s[i])) {
		if Valid(rune(s[j])) {
			return 1 + Min(
				dp[i + 1][j],
				Min(
					dp[i][j - 1],
					dp[i + 1][j - 1],
				),
			)
		} else {
			return 1 + Min(
				dp[i][j - 1],
				dp[i + 1][j - 1],
			)
		}
	} else {
		if Valid(rune(s[j])) {
			return 1 + Min(
				dp[i + 1][j],
				dp[i + 1][j - 1],
			)
		} else {
			return Min(
				1 + dp[i][j - 1],
				1 + dp[i + 1][j],
			)
		}
	}
}

func main() {
	var n int
	fmt.Scanf("%d", &n)
	var s string
	fmt.Scanf("%v", &s)

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

	for offset := 0; offset < n; offset++ {
		for i := 0; i + offset < n; i++ {
			j := i + offset
			dp[i][j] = Compute(s, dp, i, j)
		}
	}

	/*
	for i := 0; i < n; i++ {
		for j := 0; j < n; j++ {
			fmt.Printf("%d ", dp[i][j])
		}
		fmt.Println()
	}
	*/

	fmt.Println(dp[0][n - 1])
}