C. The Sports Festival
Posted Jozky86
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C. The Sports Festival相关的知识,希望对你有一定的参考价值。
题意:
n个数,依次将所有数加入到区间内,每次得到一个k,k等于当前区间的最大值减最小值,
求所有k的和的最小值
题解:
一开始就没往dp那方面想,自己在dp这方面的理解还是欠缺
正解区间dp
区间[l,r]是由左右两个小区间转移得到的,分别是[l+1,r],[l,r-1]
所以不难得到:dp[l][r]=min(dp[l+1,r],dp[l,r-1])+S
S是扩大区间长度后增加的情况,增加的情况就是最大值减最小值(即a[r] - a[l])
但是l和r不能直接从1到n枚举,因为我们说了区间[l.r]是由小区间推来的,没求出小区间怎么求大区间,所以我们循环区间长度,然后枚举左端点,右端点自然得到,这样递推式就是从小区间到大区间
代码:
#include<bits/stdc++.h>
#define debug(a,b) printf("%s = %d\\n",a,b)
typedef long long ll;
using namespace std;
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();//s=(s<<3)+(s<<1)+(ch^48);
return s*w;
}
const int maxn=2e3+9;
ll a[maxn];
ll dp[maxn][maxn];
int main()
{
ll n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
sort(a+1,a+1+n);
/*
先确定区间长度,然后依次枚举左端点
*/
for(int len=2;len<=n;len++)
{
for(int l=1;l+len-1<=n;l++)
{
int r=l+len-1;
dp[l][r]=min(dp[l+1][r],dp[l][r-1])+(a[r]-a[l]);
}
}
cout<<dp[1][n];
return 0;
}
/*
dp[l][r]=min(dp[l+1][r],dp[l][r-1])+(a[r]-a[l]);
*/
以上是关于C. The Sports Festival的主要内容,如果未能解决你的问题,请参考以下文章
CodeForces - 1509C The Sports Festival(dp)
[AGC018 B] Sports Festival 解题报告
倒计时1天!Blockchain Festival Vietnam预热片燃爆越南胡志明市!
新巴巴运动网上商城 项目 快速搭建 教程 The new babar sports online mall project quickly builds a tutorial