bzoj 4446: [Scoi2015]小凸玩密室

大dp、
f[x][y]走完以x为根的子树后,走到x的祖先的深度为y的兄弟节点的最优解 设这个点是z
x是叶子节点,f[x][y]=(dis[x]-dis[z])*A[z]
x只有左儿子,f[x][y]=A[lson[x]]*B[lson[x]]+f[lson[x]][y]
x既有左儿子,又有右儿子:
f[x][y]=min(A[lson[x]]*B[lson[x]]+f[lson[x]][dep[x]+1]+f[rson[x]][y],A[rson[x]]*B[rson[x]]+f[rson[x]][dep[x]+1]+f[lson[x]][y])
g[x][y]走完以x为根的子树后,走到x的深度为y的父亲节点的最优解,设这个点是z
x是叶子节点:g[x][y]=(dis[x]-dis[z])*A[z]  if (y==0) g[x][y]=0
x只有左儿子,g[x][y]=A[lson[x]]*B[lson[x]]+g[lson[x]][y]
x既有左儿子,又有右儿子:
g[x][y]=min(A[lson[x]]*B[lson[x]]+f[lson[x]][dep[x]+1]+g[rson[x]][y],A[rson[x]]*B[rson[x]]+f[rson[x]][dep[x]+1]+g[lson[x]][y])
枚举每个点成为第一个选的点:
x=1 ans=g[1][0]
枚举点x!=1
ans=g[x][dep[x]-1]+A[son[fa]]*B[son[fa]]+g[son[fa]][dep[fa]-1],注意特判没有右儿子的情况。
   
   
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
 
#define ll long long
#define inf 1e9
#define eps 1e-8
#define md
#define N 200010
using namespace std;
ll f[N][20],g[N][20],A[N],B[N],dis[N];
int fa[N],lson[N],rson[N],dep[N];
int main()
{
int n;
scanf("%d",&n);
int D=1; while ((1<<D)<=n) D++;
for (int i=1;i<=n;i++) scanf("%lld",&A[i]);
dep[1]=1;
for (int i=2;i<=n;i++)
{
scanf("%lld",&B[i]);
dep[i]=dep[i>>1]+1; dis[i]=dis[i>>1]+B[i];
fa[i]=i>>1; if (i&1) rson[i>>1]=i; else lson[i>>1]=i;
}
for (int x=n;x>1;x--)
for (int y=2;y<=dep[x];y++)
if (!rson[x])
{
if (!lson[x])
{
int lca=x>>(dep[x]-y+1),z=(x>>(dep[x]-y))^1;
f[x][y]=(dis[x]+dis[z]-dis[lca]-dis[lca])*A[z];
}
else f[x][y]=A[lson[x]]*B[lson[x]]+f[lson[x]][y];
}
else f[x][y]=min(A[lson[x]]*B[lson[x]]+f[lson[x]][dep[x]+1]+f[rson[x]][y],
A[rson[x]]*B[rson[x]]+f[rson[x]][dep[x]+1]+f[lson[x]][y]);
for (int x=n;x;x--)
for (int y=0;y<=dep[x];y++)
if (!rson[x])
{
if (!lson[x])
{
if (!y) g[x][y]=0;
else
{
int z=x>>(dep[x]-y);
g[x][y]=(dis[x]-dis[z])*A[z];
}
}
else g[x][y]=A[lson[x]]*B[lson[x]]+g[lson[x]][y];
}
else g[x][y]=min(A[lson[x]]*B[lson[x]]+f[lson[x]][dep[x]+1]+g[rson[x]][y],
A[rson[x]]*B[rson[x]]+f[rson[x]][dep[x]+1]+g[lson[x]][y]);
ll ans=g[1][0];
for (int i=2;i<=n;i++)
{
int x=i;
ll sum=g[x][dep[x]-1];
while (x!=1) { if ((x^1)>n) sum+=A[x>>2]*B[x>>1]; else sum+=A[x^1]*B[x^1]+g[x^1][dep[x>>1]-1]; x>>=1;}
ans=min(ans,sum);
}
printf("%lld\n",ans);
return 0;
}

使用优化算法,以优化VMD算法的惩罚因子惩罚因子 (α) 和分解层数 (K)。 1、将量子粒子群优化(QPSO)算法与变分模态分解(VMD)算法结合 VMD算法背景: VMD算法是一种自适应信号分解算法,主要用于分解信号为不同频率带宽的模态。 VMD的关键参数包括: 惩罚因子 α:控制带宽的限制。 分解层数 K:决定分解出的模态数。 QPSO算法背景: 量子粒子群优化(QPSO)是一种基于粒子群优化(PSO)的一种改进算法,通过量子行为模型增强全局搜索能力。 QPSO通过粒子的量子行为使其在搜索空间中不受位置限制,从而提高算法的收敛速度与全局优化能力。 任务: 使用QPSO优化VMD中的惩罚因子 α 和分解层数 K,以获得信号分解的最佳效果。 计划: 定义适应度函数:适应度函数根据VMD分解的效果来定义,通常使用重构信号的误差(例如均方误差、交叉熵等)来衡量分解的质量。 初始化QPSO粒子:定义粒子的位置和速度,表示 α 和 K 两个参数。初始化时需要在一个合理的范围内为每个粒子分配初始位置。 执行VMD分解:对每一组 α 和 K 参数,运行VMD算法分解信号。 更新QPSO粒子:使用QPSO算法更新粒子的状态,根据适应度函数调整粒子的搜索方向和位置。 迭代求解:重复QPSO的粒子更新步骤,直到满足终止条件(如适应度函数达到设定阈值,或最大迭代次数)。 输出优化结果:最终,QPSO算法会返回一个优化的 α 和 K,从而使VMD分解效果最佳。 2、将极光粒子(PLO)算法与变分模态分解(VMD)算法结合 PLO的优点与适用性 强大的全局搜索能力:PLO通过模拟极光粒子的运动,能够更高效地探索复杂的多峰优化问题,避免陷入局部最优。 鲁棒性强:PLO在面对高维、多模态问题时有较好的适应性,因此适合海上风电时间序列这种非线性、多噪声的数据。 应用场景:PLO适合用于优化VMD参数(α 和 K),并将其用于风电时间序列的预测任务。 进一步优化的建议 a. 实现更细致的PLO更新策略,优化极光粒子的运动模型。 b. 将PLO优化后的VMD应用于真实的海上风电数据,结合LSTM或XGBoost等模型进行风电功率预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值