【JZOJ6287】【NOIP提高组A】扭动的树
题目大意
给出n个二元组<key,val>,要求构造一棵以key为关键字的二叉搜索树,并且一条边两端的key的gcd>1。计sum[u]表示u子树内val之和,求一个构造方案令∑sum[u]最大。
n≤300,key≤1018,val≤106
分析
首先按key排序转换为中序遍历上的区间问题。
设fi,j,k表示区间[i,j]选k为根的最大值,转移O(n5),过不了。。。。
然后就有一种经典的套路:
区间[i,j]只会以i−1或j+1为根。考虑设状态fi,j,0/1表示区间[i,j]以i−1/j+1为根的最大值,由于根已经确定,枚举就变得容易了,时间复杂度降低至O(n3),空间复杂度O(n2),实现时使用记忆化搜索即可。
Code
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N = 307;
const ll INF = (1ll << 45);
int n;
ll ans, f[N][N][2], sum[N], g[N][N];
struct node { ll k, v; } a[N];
ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
int cmp(node p, node q) { return p.k < q.k; }
ll getf(int l, int r, int k)
{
if (l > r) return 0;
if (~f[l][r][k]) return f[l][r][k];
ll ret = -INF;
if (k) { for (int i = l; i <= r; i++) if (g[i][r + 1] > 1) ret = max(ret, getf(l, i - 1, 1) + getf(i + 1, r, 0) + sum[r] - sum[l - 1]); }
else { for (int i = l; i <= r; i++) if (g[i][l - 1] > 1) ret = max(ret, getf(l, i - 1, 1) + getf(i + 1, r, 0) + sum[r] - sum[l - 1]); }
return f[l][r][k] = ret;
}
int main()
{
//freopen("tree.in", "r", stdin);
//freopen("tree.out", "w", stdout);
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%lld%lld", &a[i].k, &a[i].v);
sort(a + 1, a + n + 1, cmp);
for (int i = 1; i <= n; i++) for (int j = 1; j <= n; j++) g[i][j] = gcd(a[i].k, a[j].k);
for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + a[i].v;
memset(f, -1, sizeof(f));
ans = -INF;
for (int i = 1; i <= n; i++) ans = max(ans, getf(1, i - 1, 1) + getf(i + 1, n, 0) + sum[n]);
if (ans < 0) printf("-1\n");
else printf("%lld\n", ans);
return 0;
}
作者:zjlcnblogs
出处:https://www.cnblogs.com/zjlcnblogs/p/11328191.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 继承的思维:从思维模式到架构设计的深度解析
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· 35岁程序员的中年求职记:四次碰壁后的深度反思
· 当职场成战场:降职、阴谋与一场硬碰硬的抗争
· 用99元买的服务器搭一套CI/CD系统
· Excel百万数据如何快速导入?
· ShadowSql之.net sql拼写神器