Bear and Compressing(數位dp)
阿新 • • 發佈:2021-01-15
題目連結: 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;
}