uva 11552 无后效性的动态规划

来源:互联网 发布:mcs51单片机引脚 编辑:程序博客网 时间:2024/06/11 16:53


#include<stdio.h>#include<string.h>int min(int a,int b){return a<b?a:b;}#define maxn 1010char 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;}