ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[THUSC2016] 成绩单

2021-05-02 21:04:49  阅读:193  来源: 互联网

标签:ch int text THUSC2016 抽取 区间 成绩单 define


\(\text{Problem}:\)[THUSC2016] 成绩单

\(\text{Solution}:\)

对于此类抽取一段区间计算贡献后将两端合并的问题,考虑设计区间 \(dp\)。设 \(f_{l,r}\) 表示区间 \([l,r]\) 的最小代价,\(g_{l,r,p,q}\) 表示区间 \([l,r]\) 还没抽取的成绩单中,最大值为 \(p\),最小值为 \(q\) 的最小代价。易知 \(g\rightarrow f\) 的更新为:

\[f_{l,r}=\min\{g_{l,r,p,q}+a+b\times (p-q)^{2}\} \]

即 \(f_{l,r}\) 区间内有若干段已经抽取的区间,而剩余的区间必然是连续的,故从 \(k-1\) 转移到 \(k\) 即可。

现在考虑 \(g\) 的转移,分为两类:

  • 在区间 \([l,r]\) 右端合并一段已经抽取完的区间 \([r+1,k]\),将 \(f_{r+1,k}\) 加入 \(g_{l,r}\) 中。
  • 在区间 \([l,r]\) 右端加入 \(r+1\)(不抽取 \(r+1\)),更新 \(p\) 和 \(q\) 的值。

注意 \(p,q\) 两维值域较大,需要对 \(w_{i}\) 先进行离散化后再计算。总时间复杂度 \(O(n^{5})\),且常数极小,可以通过。

\(\text{Code}:\)

#include <bits/stdc++.h>
#pragma GCC optimize(3)
//#define int long long
#define ri register
#define mk make_pair
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define is insert
#define es erase
#define vi vector<int>
#define vpi vector<pair<int,int>>
using namespace std; const int N=51;
inline int read()
{
	int s=0, w=1; ri char ch=getchar();
	while(ch<'0'||ch>'9') { if(ch=='-') w=-1; ch=getchar(); }
	while(ch>='0'&&ch<='9') s=(s<<3)+(s<<1)+(ch^48), ch=getchar();
	return s*w;
}
int n,A,B,a[N],ta[N],tb[N];
int f[N][N],g[N][N][N][N];
inline int gmax(int x,int y) { return x>y?x:y; }
inline int gmin(int x,int y) { return x<y?x:y; }
inline void cmax(int &x,int y) { x=(x>y)?x:y; }
inline void cmin(int &x,int y) { x=(x<y)?x:y; }
signed main()
{
	n=read(), A=read(), B=read();
	for(ri int i=1;i<=n;i++) a[i]=ta[i]=read();
	sort(ta+1,ta+1+n);
	int pp=unique(ta+1,ta+1+n)-ta-1;
	for(ri int i=1;i<=n;i++)
	{
		int x=a[i];
		a[i]=lower_bound(ta+1,ta+1+pp,a[i])-ta;
		tb[a[i]]=x;
	}
	memset(f,0x3f,sizeof(f));
	memset(g,0x3f,sizeof(g));
	for(ri int i=1;i<=n;i++) g[i][i][a[i]][a[i]]=0, f[i][i]=A;
	for(ri int len=2;len<=n;len++)
	for(ri int i=1;i+len-1<=n;i++)
	{
		int j=i+len-1;
		for(ri int p=1;p<=pp;p++)
		for(ri int q=1;q<=p;q++)
		for(ri int k=i;k<j;k++) cmin(g[i][j][p][q],g[i][k][p][q]+f[k+1][j]);
		for(ri int p=1;p<=pp;p++)
		for(ri int q=1;q<=p;q++)
		{
			int &to=g[i][j][gmax(p,a[j])][gmin(q,a[j])];
			cmin(to,g[i][j-1][p][q]);
		}
		for(ri int p=1;p<=pp;p++)
		for(ri int q=1;q<=p;q++) cmin(f[i][j],g[i][j][p][q]+A+B*(tb[p]-tb[q])*(tb[p]-tb[q]));
	}
	printf("%d\n",f[1][n]);
	return 0;
}

标签:ch,int,text,THUSC2016,抽取,区间,成绩单,define
来源: https://www.cnblogs.com/zkdxl/p/14726398.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有