您的位置:首页 > Web前端

CF-Codeforces Round #418 (Div. 2)-C-An impassioned circulation of affection

2017-06-16 00:09 507 查看
ACM模版

描述





题解

对于这种海量查询的问题,不用多想,99 成需要预处理,而常见的预处理手段除了线段树、树状数组、RMQ 之类,还有 DP 等等,这里用的就是 DP 预处理。

设 dp[i][j] 表示对于字符 i 进行 j 次修改的最优解,初始化 dp[i][j]=j,因为不管序列如何,我们都可以肯定的是经过 j 次修改至少有 j 个连续的字符 i。

其他就没有什么可说的了~~~

代码

#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

const int MAXN = 1555;
const int MAXC = 26;

int n, q;
char str[MAXN];
int dp[MAXC][MAXN];

int main()
{
while (cin >> n)
{
memset(dp, 0, sizeof(dp));

scanf("%s", str);

for (int i = 0; i < MAXC; i++)
{
for (int j = 0; j <= n; j++)
{
dp[i][j] = j;
}
}

for (int i = 0; i < n; i++)
{
int c = str[i] - 'a';
int tmp = 1, k = i + 1;
dp[c][0] = 1;
for (int j = 0; j <= n; )
{
if (k >= n || str[i] != str[k])
{
j++;
}
tmp++;
if (tmp == n)
{
while (j <= n)
{
dp[c][j++] = n;
}
break;
}
dp[c][j] = max(dp[c][j], tmp);
k++;
}
}

cin >> q;

int m;
char c[3];
while (q--)
{
scanf("%d%s", &m, c);
printf("%d\n", dp[c[0] - 'a'][m]);
}
}

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  dp