镇江市建设招标网官方网站,网站设计专业建站公司,上海品牌策划设计,网站设计用处正题 题目大意
一颗二叉查找树#xff0c;以keyikey_ikeyi为建值#xff0c;以pip_ipi为价值。然后一个节点的sumsumsum定义为这棵子树的价值之和。
要求相邻两个节点不互质的情况下所有节点的最大sumsumsum值之和。 解题思路
二叉查找树满足中序遍历的建值从小到大以keyikey_ikeyi为建值以pip_ipi为价值。然后一个节点的sumsumsum定义为这棵子树的价值之和。
要求相邻两个节点不互质的情况下所有节点的最大sumsumsum值之和。 解题思路
二叉查找树满足中序遍历的建值从小到大所以我们考虑区间dpdpdp。
每次将两个区间组成的二叉树合并在一起。
我们预处理出哪些节点可以相邻
设f0/1,i,jf_{0/1,i,j}f0/1,i,j表示作为将作为左边/右边的子树与上将上一个合并过来(根为i/ji/ji/j且没有另一边子树)时的最大价值。
那么我们可以得出动态转移方程 f0,i,jf1,i,k,f0,k1,j(vi−1,k)f_{0,i,j}f_{1,i,k},f_{0,k1,j}(v_{i-1,k})f0,i,jf1,i,k,f0,k1,j(vi−1,k) f1,i,jf1,i,k,f0,k1,j(vk,j1)f_{1,i,j}f_{1,i,k},f_{0,k1,j}(v_{k,j1})f1,i,jf1,i,k,f0,k1,j(vk,j1) codecodecode
#includecstdio
#includecstring
#includealgorithm
#define ll long long
using namespace std;
const ll N310;
struct node{ll k,p;
}a[N];
ll n,f[2][N][N],ans,s[N];
bool v[N][N];
bool cmp(node x,node y)
{return x.ky.k;}
int main()
{//freopen(tree.in,r,stdin);//freopen(tree.out,w,stdout);scanf(%lld,n);for(ll i1;in;i)scanf(%lld%lld,a[i].k,a[i].p);for(int i1;i300;i)for(int j1;j300;j)for(int k0;k2;k)f[k][i][j]-0x7fffffffffffffll;sort(a1,a1n,cmp);ans-1e18;for(ll i1;in;i)for(ll j1;jn;j) v[i][j](__gcd(a[i].k,a[j].k)1);for(ll i1;in;i){s[i]s[i-1]a[i].p;if(i!1!v[i][i-1]) f[0][i][i]a[i].p;if(i!n!v[i][i1]) f[1][i][i]a[i].p;}for(ll l2;ln;l){for(ll i1;in-l1;i){ll jil-1;for(ll ki;kj;k){ll b;if(ki) bf[0][i1][j](s[j]-s[i-1]);if(kj) bf[1][i][j-1](s[j]-s[i-1]);if(ikjk) bf[1][i][k-1]f[0][k1][j](s[j]-s[i-1]);if(i!1!v[k][i-1]) f[0][i][j]max(f[0][i][j],b);if(i!n!v[k][j1]) f[1][i][j]max(f[1][i][j],b);if(ln) ansmax(ans,b);}}}if(ans0) printf(-1);else printf(%lld,ans);
}