(dp)CF102302E.Chi's performance

CF102302E.Chi’s performance

题意&思路:

有一个演出,N个人参与,每个人的乐器编号Vi,能力编号Pi,演出按Vi从小到大表演。人们的享受值为两个不同乐器的P的差值的绝对值之和,问最大的享受值为多少。
为了使差值尽可能大,我们要使相邻的不同乐器之间的差值尽可能大。我们可以写几组数据构造发现,只有最大最小,次大次小影响较大。
因为对于一个乐器的相邻乐器来说,只有与他的最大最小值的差值才会最大,因为每个乐器(除了第一个和最后一个)都有两个乐器相邻,所以我们考虑最大最小值和次大次小值。
将乐器排序,分类。
对于乐器数目不满四个的,用-1标记。又可得如果一个乐器只有一种,那这个乐器的p值可以(必须)使用两次,此时将数组全部赋为此值。
用dp[i][j]表示选了i种乐器,此时选第j个乐器的最大权值,v[i][j]表示第i种乐器,第j个乐器的权值。
可得状态转移方程:
dp[i][j]=max{dp[i-1][m]+abs(v[i][j]-v[i-1][k]}(m≠k)很显然,一个乐器不能使用两次,所以m不能等于k。
最后求max{dp[len][j]} len为乐器的种类数目。

代码:

#include<bits/stdc++.h>
#define pii pair<int,int>
#define int long long
#define cl(x,y) memset(x,y,sizeof(x))
#define ct cerr<<"Time elapsed:"<<1.0*clock()/CLOCKS_PER_SEC<<"s.\n";
const int N=1e6+10;
const int mod=1e7+9;
const int maxn=0x3f3f3f3f;
const int minn=0xc0c0c0c0;
const int inf=99999999;
using namespace std;
struct music
{
	int w,p;
}a[N];
vector<int> b[N];
int cmp(music x,music y)
{
	return x.p<y.p;
}
int v[N][5]={0},dp[N][5]={0};
signed main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	int n,i,j,k,m;
	cin>>n;
	for(i=1;i<=n;i++)
		cin>>a[i].p>>a[i].w;
	sort(a+1,a+n+1,cmp);
	int f=a[1].p,len=1;
	for(i=1;i<=n;i++)
	{
		if(a[i].p==f)
			b[len].push_back(a[i].w);
		else
		{
			f=a[i].p;
			b[++len].push_back(a[i].w);
		}
	}
	for(i=1;i<=len;i++)
	{
		sort(b[i].begin(),b[i].end());
		int l=b[i].size();
		if(l==1)
			for(j=1;j<=4;j++)
				v[i][j]=b[i][0];
		else if(l<4)
		{
			for(j=1;j<=l;j++)
				v[i][j]=b[i][j-1];
			for(j=l+1;j<=4;j++)
				v[i][j]=-1;
		}
		else
		{
			v[i][1]=b[i][0];
			v[i][2]=b[i][1];
			v[i][3]=b[i][l-2];
			v[i][4]=b[i][l-1];
		}
	}
	for(i=1;i<=4;i++)
		v[0][i]=-1;
	for(i=1;i<=len;i++)
	{
		for(j=1;j<=4;j++)
			for(k=1;k<=4;k++)	
				for(m=1;m<=4;m++)
					if(v[i][j]!=-1 && v[i-1][k]!=-1 && m!=k)
						dp[i][j]=max(dp[i][j],dp[i-1][m]+abs(v[i][j]-v[i-1][k]));
	}
	int ans=-maxn;
	for(i=1;i<=4;i++)
		ans=max(ans,dp[len][i]);
	cout<<ans<<endl;
	return 0;
}

发布了120 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Z7784562/article/details/104248910