using
System;
using
System.Collections.Generic;
class
GFG
{
static
int
[] prefix_function(String s)
{
int
n = s.Length;
int
[] pi =
new
int
[n];
for
(
int
i = 1 ; i < n ; i++) {
int
j = pi[i - 1];
while
(j > 0 && s[i] != s[j]){
j = pi[j - 1];
}
if
(s[i] == s[j]){
j++;
}
pi[i] = j;
}
return
pi;
}
static
void
minLength(String s,
int
n)
{
int
[][] dp =
new
int
[n + 1][];
for
(
int
i = 0 ; i <= n ; i++){
dp[i] =
new
int
[n+1];
}
foreach
(
int
[] row
in
dp){
for
(
int
i = 0 ; i < row.Length ; i++){
row[i] = 10000;
}
}
for
(
int
l = 1 ; l <= n ; l++) {
for
(
int
i = 0; i < n - l + 1; i++) {
int
j = i + l - 1;
if
(i == j) {
dp[i][j] = 1;
continue
;
}
for
(
int
k = i; k < j; k++) {
dp[i][j] = Math.Min(dp[i][j], dp[i][k] + dp[k + 1][j]);
}
String temp = s.Substring(i, l);
int
[] pref = prefix_function(temp);
if
(l % (l - pref[l - 1]) == 0) {
dp[i][j] = Math.Min(dp[i][j], dp[i][i + (l - pref[l - 1] - 1)]);
}
}
}
Console.Write(dp[0][n - 1]);
}
public
static
void
Main(
string
[] args){
int
n = 4;
String s =
"aaba"
;
minLength(s, n);
}
}