题意是对于当前的一行,求出转换到不能再转换状态所需的最多步数
题目看起来没有思路,感觉找不到状态转移方程
看了别人的题解才知道这个题还是很容易的
但是需要想到stl map
我们用dp[s]表示把s转换为不能转换所需的最多步数
如果可以由s转换到t
则有:dp[s] = max(dp[s], dp[t])
因为起始状态不好找,所以用记忆化搜索来写比较好
代码如下:
#include <map>
#include <cstdio>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
string s, t;
map<string, int> dp;
int dfs(string s) {
if(dp[s]) return dp[s];
dp[s] = 0;
for(int i=0; i<10; ++i) {
if(s[i]=='-' && s[i+1]=='o' && s[i+2]=='o') {
t = s;
t[i] = 'o'; t[i+1] = '-'; t[i+2] = '-';
dp[s] = max(dp[s], dfs(t)+1);
}
if(s[i]=='o' && s[i+1]=='o' && s[i+2]=='-') {
t = s;
t[i] = '-'; t[i+1] = '-'; t[i+2] = 'o';
dp[s] = max(dp[s], dfs(t)+1);
}
}
return dp[s];
}
int main(void) {
int n, ans;
scanf("%d", &n);
while(n--) {
cin >> s;
ans = 0;
for(int i=0; i<12; ++i)
if(s[i] == 'o')
++ans;
printf("%d\n", ans-dfs(s));
}
return 0;
}