UVA 11552 四 Fewest Flops

Fewest Flops

Time Limit:2000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu

Submit Status Practice UVA 11552

 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 }

时间: 2024-10-24 02:38:52

UVA 11552 四 Fewest Flops的相关文章

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[max

uva 11552 Fewest Flops 线性dp

// uva 11552 Fewest Flops // // 二维线性dp // // 首先,在该块必须是相同的来信.首先记录每块有很多种书 // 称为是counts[i]; // // 订购f[i][j]它代表前i字母j为结尾的最小分块数 // // 假设第i块的開始字母与第i-1块的结束字母同样 // f[i][j] = min(f[i][j],f[i-1][k] + counts[i] - 1); // // 否则 // // f[i][j] = min(f[i][j],f[i-1][k

多维DP UVA 11552 Fewest Flop

题目传送门 1 /* 2 题意:将子符串分成k组,每组的字符顺序任意,问改变后的字符串最少有多少块 3 三维DP:可以知道,每一组的最少块是确定的,问题就在于组与组之间可能会合并块,总块数会-1. 4 dp[i][j]表示第i组以第j个字符结尾的最少块数,状态转移方程:dp[i][j] = min (dp[i][j], dp[i-1][l] + chunk - 1); 5 意思就是枚举上一组的所有字符,当出现在i组并且不是放到末尾,那么能-1 6 */ 7 /******************

uva 11552 dp

UVA 11552 - Fewest Flops 一个字符串,字符串每 k 个当作一组,组中的字符顺序可以重组.问经过重组后改字符串可以编程最少由多少块字符组成.连续的一段字符被称为块. dp[i][j] 表式第i组以字符j结尾的最少块数. 那么我们考虑添加一组后可以减少块数的情况. 1):上一组的结尾在这一组里找得到同样的字符,并且该字符不作为当前块的结尾.如果要作为结尾的话要把该字符所在的块拆开,所以然并卵. 2):当前组只有一种字符,并且和上一组的结尾相同. 这两种情况都可以使块数减一 d

UVA 11552 Fewest Flops

题解: 也是比较简单的DP dp[i][j]表示第i个.以字母j结尾的最小值 注意小trick. 整个分组都同一个字母,这时候就不用判断头尾是否相同了 代码用到了一些c ++ 11的新姿势,auto太强了~ 代码: #include<bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define se second #define fs first #define lson l,m,rt

UVa 11552 最小的块数(序列划分模型:状态设计)

https://vjudge.net/problem/UVA-11552 题意:输入一个正整数k和字符串S,字符串的长度保证为k的倍数.把S的字符按照从左到右的顺序每k个分成一组,每组之间可以任意重排,但组与组之间的先后顺序应保持不变.你的任务是让重排后的字符串包含尽量少的“块”,其中每个块为连续的相同字母. 思路: 令d[i][j]表示第i组中第j位为末尾时的最小块数. 对于第[i]组,我们首先计算出它的块数,即不同字母的个数. 接下来枚举[i]组中第j个字母作为末尾时的情况,根据第[i-1]

dp题目列表

10271 - Chopsticks 10739 - String to Palindrome 10453 - Make Palindrome 10401 - Injured Queen Problem 825 - Walking on the Safe Side 10617 - Again Palindrome 10201 - Adventures in Moving - Part IV 11258 - String Partition 10564 - Paths through the Ho

训练指南DP阶段训练1

最近又忙又颓.............时间抓不紧....下学期开始就要准备考研了.......就2个月左右可以做自己喜欢的事了....争取把紫书和白书没做的,做过的..来一次完整的总结 训练指南上面的5个例题+后面15个习题是第一阶段 vjudge训练地址 http://vjudge.net/contest/139533#overview -------------------------------------------------------------------------------

UVA - 297Quadtrees(四分图)

Quadtrees Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu Submit Status Description A quadtree is a representation format used to encode images. The fundamental idea behind the quadtree is that any image can be split into fo