D. Recovering BST Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)

树DP优化算法解析
本文深入探讨了树DP优化算法的实现细节,通过具体代码示例讲解如何利用该算法解决特定问题。文章首先介绍了算法的基本原理,然后展示了如何在代码中实现这一算法,包括关键的数据结构定义和状态转移方程。最后,通过实例演示了算法的有效性和适用场景。

http://codeforces.com/contest/1025/problem/D

 

树 dp 优化

  f[x][y][0]=f[x][z][1] & f[z+1][y][0] ( gcd(a[x-1],a[z])<>0 )

  f[x][y][1]=f[x][z][1] & f[z+1][y][0] ( gcd(a[z],a[y+1])<>0 )

 

 1 #include <cstdio>
 2 #include <cstdlib>
 3 #include <cmath>
 4 #include <cstring>
 5 #include <time.h>
 6 #include <string>
 7 #include <set>
 8 #include <map>
 9 #include <list>
10 #include <stack>
11 #include <queue>
12 #include <vector>
13 #include <bitset>
14 #include <ext/rope>
15 #include <algorithm>
16 #include <iostream>
17 using namespace std;
18 #define ll long long
19 #define minv 1e-6
20 #define inf 1e9
21 #define pi 3.1415926536
22 #define E  2.7182818284
23 const ll mod=1e9+7;//998244353
24 const int maxn=1e3+10;
25 
26 int a[maxn];
27 bool vis[maxn][maxn]={0},f[maxn][maxn][2]={0};
28 
29 int main()
30 {
31     int n,i,j,x,y,z;
32     scanf("%d",&n);
33     for (i=1;i<=n;i++)
34         scanf("%d",&a[i]);
35     for (i=1;i<n;i++)
36         for (j=i+1;j<=n;j++)
37             vis[i][j]=(__gcd(a[i],a[j])!=1);
38     for (i=0;i<=n;i++)
39         vis[0][i]=1,vis[i][n+1]=1;
40     for (i=1;i<=n+1;i++)
41         f[i][i-1][0]=f[i][i-1][1]=1;
42     for (i=1;i<=n;i++)
43         for (x=1,y=i;x<=n-i+1;x++,y++)
44             for (z=x;z<=y;z++)
45                 if (f[x][z-1][1] && f[z+1][y][0])
46                 {
47                     if (vis[x-1][z])
48                         f[x][y][0]=1;
49                     if (vis[z][y+1])
50                         f[x][y][1]=1;
51                 }
52     if (f[1][n][0])
53         printf("Yes");
54     else
55         printf("No");
56     return 0;
57 }

 

转载于:https://www.cnblogs.com/cmyg/p/9530998.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值