1 条题解
-
0
自动搬运
来自洛谷,原作者为

T_Q_X
AFO搬运于
2025-08-24 22:09:42,当前版本为作者最后更新于2020-11-25 14:49:19,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
传送门
容易发现这是道区间DP题目,于是走流程:
一.定义状态
-
根据答案,考虑 表示区间 中的成绩单全部被发放需要的最小代价,那么答案就是 。
-
但是这道题目的发放成绩单方式比较奇妙,发放一段区间可能可以先在区间中随意选择一些部分来发放,再将剩下的部分发放。
-
注意到分发代价只与一段区间中分数的 与 有关,于是我们令 为区间 中的所有成绩单发放一部分后剩下的成绩单的分数最大值为 ,最小值为 时的最小代价
-
于是有
二.状态转移
-
考虑加入新成绩单 时的转移:
-
1.保留第张成绩单不取走,未来与 中的成绩单共同取走:
- 2.枚举 ,将 这段区间的成绩单共同取走
-
注意到第一个转移是填表,第二个转移是刷表
-
于是将第二个转移稍微变化一下变化成
- 再在区间DP枚举时从1开始枚举即可
三、代码
#include<bits/stdc++.h> using namespace std; const int N=55; int n,a,b,w[N],f[N][N],g[N][N][N][N],d[N]; int tot; int main(){ scanf("%d%d%d",&n,&a,&b); for(int i=1;i<=n;++i) scanf("%d",&w[i]),d[i]=w[i]; sort(d+1,d+n+1);tot=unique(d+1,d+n+1)-d-1; for(int i=1;i<=n;++i) w[i]=lower_bound(d+1,d+tot+1,w[i])-d,f[i][i]=a; memset(g,0x3f,sizeof(g));memset(f,0x3f,sizeof(f)); for(int i=1;i<=n;++i)g[i][i][w[i]][w[i]]=0; for(int len=1;len<=n;++len) for(int l=1,r=len;r<=n;++l,++r) for(int mn=1;mn<=tot;++mn) for(int mx=mn;mx<=tot;++mx){ int &G=g[l][r][mn][mx]; for(int k=l;k<r;++k) G=min(g[l][k][mn][mx]+f[k+1][r],G); int &gg=g[l][r+1][min(mn,w[r+1])][max(mx,w[r+1])]; gg=min(gg,G);f[l][r]=min(f[l][r],G+a+b*(d[mx]-d[mn])*(d[mx]-d[mn])); } printf("%d\n",f[1][n]); } -
- 1
信息
- ID
- 4332
- 时间
- 2000ms
- 内存
- 500MiB
- 难度
- 6
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者