代码来自xxy大佬,她应该不会介意的。
我应该可以想出来的,我太菜了,用之前的状态维护当前状态,扫一遍就可以了。
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define N 1002
char s[N];
int f[N][2];
int main()
{
int T, x, y, n;
scanf("%d", &T);
for (int t = 1; t <= T; ++t)
{
scanf("%d%d%s", &x, &y, s + 1);
n = strlen(s + 1);
for (int i = 0; i <= n; ++i)
f[i][0] = f[i][1] = 2e9;
f[1][0] = f[1][1] = 0;
for (int i = 2; i <= n; ++i)
{
if (s[i] == 'C')
{
if (s[i - 1] == 'C')
f[i][0] = f[i - 1][0];
else if (s[i - 1] == 'J')
f[i][0] = f[i - 1][1] + y;
else
f[i][0] = min(f[i - 1][0], f[i - 1][1] + y);
}
else if (s[i] == 'J')
{
if (s[i - 1] == 'C')
f[i][1] = f[i - 1][0] + x;
else if (s[i - 1] == 'J')
f[i][1] = f[i - 1][1];
else
f[i][1] = min(f[i - 1][0] + x, f[i - 1][1]);
}
else
{
if (s[i - 1] == '?')
{
f[i][0] = min(f[i - 1][0], f[i - 1][1] + y);
f[i][1] = min(f[i - 1][1], f[i - 1][0] + x);
}
else if (s[i - 1] == 'C')
{
f[i][0] = f[i - 1][0];
f[i][1] = f[i - 1][0] + x;
}
else
{
f[i][0] = f[i - 1][1] + y;
f[i][1] = f[i - 1][1];
}
}
}
printf("Case #%d: %d\n", t, min(f[n][0], f[n][1]));
}
return 0;
}