题目链接: Bear and Compressing
大致题意:
给出q组数据,每组数据有一个长度为2的字符串ai和一个字符bi,表示字符串ai可以转化成bi,现在限定一段长度为n的字符串,当它最前的两个字符和ai可以匹配,则可以转换为bi,转换次数不限。
现在问有多少段这样的字符串最终可以转化成’a’。
解题思路:
数位dp
f[i][j][flag]表示处理到第i位,前一位是j,flag表示是否合法
AC代码:
#include <bits/stdc++.h>
using namespace std;
int n, m;
string a[40], b[40];
int f[10][10][2];
int dfs(int pos, int pre, int flag) {
if (!pos)return flag;
if (f[pos][pre][flag] != -1)return f[pos][pre][flag];
int res = 0;
for (int i = 0; i < m; ++i) {
res += dfs(pos - 1, a[i][0] - 'a', flag && (b[i][0] - 'a' == pre));
}
f[pos][pre][flag] = res;
return res;
}
int main() {
cin >> n >> m;
for (int i = 0; i < m; ++i)cin >> a[i] >> b[i];
memset(f, -1, sizeof f);
cout << dfs(n - 1, 0, 1) << endl;
return 0;
}