UVa 11552 DP Fewest Flops

题解

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <algorithm>
 4 using namespace std;
 5 
 6 const int maxn = 1000 + 10;
 7 const int maxm = 30;
 8 
 9 int n, k;
10 
11 char s[maxn];
12 int d[maxn][maxm];
13 
14 int cnt[maxn];
15 bool vis[maxn][maxm];
16 
17 int main()
18 {
19     int T; scanf("%d", &T);
20     while(T--)
21     {
22         scanf("%d %s", &k, s);
23         n = strlen(s);
24 
25         memset(d, 0x3f, sizeof(d));
26         memset(cnt, 0, sizeof(cnt));
27         memset(vis, false, sizeof(vis));
28         for(int i = 0; i < n; i += k)
29         {
30             for(int j = 0; j < k; j++)
31             {
32                 int ch = s[i + j] - 'a';
33                 if(!vis[i][ch]) cnt[i]++;
34                 vis[i][ch] = true;
35             }
36         }
37 
38         for(int i = 0; i < 26; i++) if(vis[0][i]) d[0][i] = cnt[0];
39 
40         for(int i = k; i < n; i += k)
41             for(int j = 0; j < 26; j++) if(vis[i][j])
42                 for(int t = 0; t < 26; t++) if(vis[i - k][t])
43                 {
44                     if(vis[i][t] && (j != t || cnt[i] == 1))
45                         d[i][j] = min(d[i][j], d[i-k][t] + cnt[i] - 1);
46                     else
47                         d[i][j] = min(d[i][j], d[i-k][t] + cnt[i]);
48                 }
49 
50         int ans = n;
51         for(int i = 0; i < 26; i++) ans = min(ans, d[n - k][i]);
52         printf("%d\n", ans);
53     }
54 
55     return 0;
56 }
代码君

 

posted @ 2015-08-03 21:45  AOQNRMGYXLMV  阅读(158)  评论(0编辑  收藏  举报