#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 205;
const int ALPHABET = 26;
const int INF = 1e9+7;
// dp[pos][x][c][op] -> 記錄以 c 結尾的字串數
long long dp[MAX_N][MAX_N][ALPHABET][2]; // 0: '<', 1: '>'
int N, M;
vector<pair<int, int>> constraints; // (i, j) 條件: T[i] <= T[j]
void solve() {
cin >> N >> M;
constraints.resize(M);
for (auto &[i, j] : constraints) {
cin >> i >> j;
i--, j--; // 轉換為 0-based
}
// 初始化 dp,只有長度為 1 的字串是合法的
for (int c = 0; c < ALPHABET; c++) {
dp[N-1][N-1][c][0] = 1;
dp[N-1][N-1][c][1] = 1;
}
// 自底向上填表
for (int pos = N - 2; pos >= 0; pos--) {
for (int x = pos; x < N; x++) {
for (int c = 0; c < ALPHABET; c++) {
for (int op = 0; op < 2; op++) {
long long &cur = dp[pos][x][c][op];
// 保持相同字符,繼承之前的 dp
cur += dp[pos + 1][x][c][op];
// 選擇不同字符,更新 x
for (int c2 = 0; c2 < ALPHABET; c2++) {
if (c2 == c) continue;
if ((c2 < c && op == 0) || (c2 > c && op == 1)) {
cur += dp[pos + 1][pos][c2][op];
}
}
cur %= INF;
}
}
}
}
// 檢查 constraints,將不滿足條件的狀態設為 0
for (auto &[i, j] : constraints) {
for (int c1 = 0; c1 < ALPHABET; c1++) {
for (int c2 = 0; c2 < ALPHABET; c2++) {
if (c1 > c2) { // 違反 T[i] <= T[j]
dp[i][j][c1][1] = 0;
}
}
}
}
// 統計結果
long long result = 0;
for (int c = 0; c < ALPHABET; c++) {
for (int op = 0; op < 2; op++) {
result += dp[0][0][c][op];
result %= INF;
}
}
cout << result << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
solve();
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |