#include<stdio.h>
#include<string.h>
int min(int a,int b)
{
return a<b?a:b;
}
#define maxn 1010
char s[maxn];
int n;
int dp[maxn][30];
int vis[30];
int main()
{
int i,j,k;
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d %s",&n,s);
int len=strlen(s);
int num=len/n;
memset(vis,0,sizeof(vis));
memset(dp,0x7f,sizeof(dp));
int temp;
temp=0;
for(i=0;i<n;i++)
{
if(!vis[s[i]-'a'])
{
temp++;
vis[s[i]-'a']=1;
}
}
for(i=0;i<26;i++)
{
if(vis[i])
{
dp[1][i]=temp;
}
}
for(i=2;i<=num;i++)
{
memset(vis,0,sizeof(vis));
temp=0;
for(j=(i-1)*n;j<i*n;j++)
{
if(!vis[s[j]-'a'])
{
temp++;
vis[s[j]-'a']=1;
}
}
char jch;
char kch;
for(j=0;j<26;j++)
{
jch='a'+j;
kch;
if(vis[j])
{
for(k=0;k<26;k++)
{
kch='a'+k;
if(k==j)continue;
if(vis[k])
{
dp[i][k]=min(dp[i][k],dp[i-1][j]+temp-1);
}
}
if(temp>1)
{
dp[i][j]=min(dp[i][j],dp[i-1][j]+temp);
}
else
{
dp[i][j]=min(dp[i][j],dp[i-1][j]);
}
}
else
{
for(k=0;k<26;k++)
{
kch='a'+k;
if(vis[k])
{
dp[i][k]=min(dp[i][k],dp[i-1][j]+temp);
}
}
}
}
}
int ans=1<<30;
for(i=0;i<30;i++)
{
ans=min(ans,dp[num][i]);
}
printf("%d\n",ans);
}
return 0;
}
uva 11552 无后效性的动态规划
最新推荐文章于 2024-04-09 09:26:34 发布