UVA 11552 四 Fewest Flops

Fewest Flops

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
",ans);
84     }
85     return 0;
86 }
View Code
原文地址:https://www.cnblogs.com/cyd308/p/4771573.html