标签:
Time Limit:2000MS Memory Limit:0KB 64bit IO Format:%lld & %llu
1 #include <stdio.h> 2 #include <string.h> 3 #include <algorithm> 4 using namespace std; 5 int main() 6 { 7 int T; 8 int k,numk; 9 int i,j; 10 char a[1005]; 11 int num[1005],q[1005][30],dp[1005][30]; 12 scanf("%d",&T); 13 while(T--) 14 { 15 memset(num,0,sizeof(num)); 16 memset(q,0,sizeof(q)); 17 memset(dp,0,sizeof(dp)); 18 scanf("%d",&k); 19 scanf("%s",a); 20 int l=strlen(a); 21 numk=l/k; 22 if(l%k!=0) 23 numk++; 24 for(i=1;i<=numk;i++) 25 { 26 for(j=(i-1)*k;j<=i*k-1 && j<l;j++) 27 { 28 int o=a[j]-‘a‘+1; 29 if(q[i][o]==0) 30 { 31 num[i]++; 32 q[i][o]=1; 33 } 34 } 35 } 36 37 for(i=1;i<=26;i++) 38 { 39 if(q[1][i]==1) 40 dp[1][i]=num[1]; 41 } 42 43 for(i=2;i<=numk;i++) 44 { 45 for(j=1;j<=26;j++) 46 { 47 if(q[i][j]==1) 48 { 49 if(q[i-1][j]==1) 50 { 51 dp[i][j]=dp[i-1][j]+num[i]; 52 if(num[i-1]==1) 53 dp[i][j]--; 54 else 55 { 56 for(int u=1;u<=26;u++) 57 { 58 if(u!=j && q[i-1][u]==1) 59 dp[i][j]=min(dp[i][j],dp[i-1][u]+num[i]-1); 60 } 61 } 62 } 63 else 64 { 65 dp[i][j]=9999; 66 for(int u=1;u<=26;u++) 67 { 68 if(q[i-1][u]==1) 69 dp[i][j]=min(dp[i][j],dp[i-1][u]+num[i]); 70 } 71 } 72 } 73 } 74 } 75 76 int ans=9999; 77 for(int i=1;i<=26;i++) 78 { 79 if(q[numk][i]==1 && dp[numk][i]<ans) 80 ans=dp[numk][i]; 81 } 82 83 printf("%d\n",ans); 84 } 85 return 0; 86 }
标签:
原文地址:http://www.cnblogs.com/cyd308/p/4771573.html