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;}