CF1025D Recovering BST

思路:

dp。

实现:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int MAXN = 705;
 4 int a[MAXN], g[MAXN][MAXN], dp[2][MAXN][MAXN];
 5 int check(int p, int s, int l, int r)
 6 {
 7     if (l == r) return g[p][l] != 1;
 8     if (dp[s][l][r] != -1) return dp[s][l][r];
 9     int flg = 0;
10     for (int i = l; i <= r; i++)
11     {
12         if (g[p][i] == 1) continue;
13         if (i > l && !check(i, 0, l, i - 1)) continue;
14         if (i < r && !check(i, 1, i + 1, r)) continue;
15         flg = 1; break;
16     }
17     return dp[s][l][r] = flg;
18 }
19 int main()
20 {
21     int n;
22     while (cin >> n)
23     {
24         for (int i = 1; i <= n; i++) cin >> a[i];
25         for (int i = 1; i <= n; i++)
26         {
27             for (int j = 1; j <= n; j++)
28                 g[i][j] = __gcd(a[i], a[j]);
29         }
30         memset(dp, -1, sizeof dp);
31         int flg = 0;
32         for (int i = 1; i <= n; i++)
33         {
34             if (i > 1 && !check(i, 0, 1, i - 1)) continue;
35             if (i < n && !check(i, 1, i + 1, n)) continue;
36             flg = 1; break;
37         }
38         cout << (flg ? "Yes" : "No") << endl;
39     }
40     return 0;
41 }

猜你喜欢

转载自www.cnblogs.com/wangyiming/p/9611302.html
BST