其他分享
首页 > 其他分享> > 8.2测试

8.2测试

作者:互联网

A.蓝蓝的棋盘

dp题
因为蓝蓝走过棋之后下一个人是先手,可以把问题简化为一个保证先手且不断减少的棋盘。
设计状态:dp[i]表示在第i位下,先后手最优策略下的差值,因为是先手减去后手,所以也是最大差值

从n到0倒序dp,设计转移方程为:dp[i]=max(a[y]-dp[y])\(i<y \leq i+m\)
可用单调队列来优化

AC Code
#include<bits/stdc++.h>
using namespace std;

#define ll long long

inline ll read()
{
	ll x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}

const int N=2e6+5;
ll n,m,a[N],dp[N],q[N];

int main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++)a[i]=read();
	int l=1,r=1;
	q[r]=n;
	for(int i=n-1;i>=0;i--)
	{
		while(l<r&&min(n,i+m)<q[l])l++;
		dp[i]=a[q[l]]-dp[q[l]];
		while(l<=r&&a[q[r]]-dp[q[r]]<a[i]-dp[i])r--;
		q[++r]=i;
	}
	cout<<dp[0]<<endl;
	return 0;
}

B.淘淘的集合

AC Code

C.蓝蓝的程序

标签:ch,ll,while,8.2,测试,蓝蓝的,dp,getchar
来源: https://www.cnblogs.com/mkik/p/16545235.html