解题报告 『[USACO5.4]Canada Tour(线性动规)』
此题让我知道了快读和取消同步后的cin貌似不能一起用?
算了,反正取消同步后的cin也挺快的。
代码实现如下:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <bits/stdc++.h> using namespace std; #define rep(i, a, b) for (register int i = (a); i <= (b); i++) const int maxm = 1e2 + 5;; int n, v, ans = 1; int dp[maxm][maxm]; bool vis[maxm][maxm]; string s, s1, s2; map<string, int> map_city; int MAX(int a, int b) {return a > b ? a : b;} void write(int x) { if (x < 0) { putchar('-'); x = -x; } if (x > 9) write(x / 10); putchar(x % 10 + '0'); } int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); cin >> n >> v; rep(i, 1, n) { cin >> s; map_city[s] = i; } rep(i, 1, v) { cin >> s1 >> s2; vis[map_city[s1]][map_city[s2]] = 1; vis[map_city[s2]][map_city[s1]] = 1; } dp[1][1] = 1; rep(i, 1, n - 1) rep(j, i + 1, n)//i,j之后会对换,所以j就直接从i + 1开始. rep(k, 1, j - 1) if (vis[j][k] && dp[i][k]) dp[i][j] = dp[j][i] = MAX(dp[i][j], dp[i][k] + 1); rep(i, 1, n) if (vis[i][n]) ans = MAX(ans, dp[i][n]); write(ans); return 0; }