社区讨论

最小值对了最大值错了是啥情况qwq

P1880[NOI1995] 石子合并参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mi7wwqy5
此快照首次捕获于
2025/11/21 04:57
4 个月前
此快照最后确认于
2025/11/21 04:57
4 个月前
查看原帖
RT
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll maxn=1010;
const ll INF=2147483647;
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<<3)+(x<<1)+ch-'0';
		ch=getchar();
	}
	return x*f;
}
inline void write(ll x)
{
	if(x<0)
	{
		putchar('-');
		x=-x;
	}
	if(x>9)
	{
		write(x/10);
	}
	putchar(x%10+'0');
}
ll n,a[maxn],sum[maxn],dp[maxn][maxn],ans1=INF,ans2=-INF;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=2*n;j++)dp[i][j]=INF;
	}
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
		sum[i]=sum[i-1]+a[i];
		dp[1][i]=0;
	}
	for(int i=n+1;i<=2*n;i++)
	{
		a[i]=a[i-n];
		sum[i]=sum[i-1]+a[i];
		dp[1][i]=0;
	}
	for(int i=2;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			for(int k=j;k<=j+i-2;k++)
			{
				dp[i][j]=min(dp[k-j+1][j]+dp[j+i-k-1][k+1],dp[i][j]);
			}
			dp[i][j]+=sum[j+i-1]-sum[j-1];
		}
	}
	for(int i=1;i<=n;i++)
	{
		ans1=min(ans1,dp[n][i]);
		//cout<<ans1<<endl;
	}
	cout<<ans1<<endl;
	for(int i=2;i<=n;i++)
	{
		for(int j=1;j<=2*n;j++)dp[i][j]=-INF;
	}
	//for(int i=1;i<=n;i++)cout<<dp[1][i]<<endl;
	for(int i=2;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			for(int k=j;k<=j+i-2;k++)
			{
				dp[i][j]=max(dp[k-j+1][j]+dp[j+i-k-1][k+1],dp[i][j]);
			}
			dp[i][j]+=sum[j+i-1]-sum[j-1];
		}
	}
	for(int i=1;i<=n;i++)
	{
		ans2=max(ans2,dp[n][i]);
		//cout<<ans2<<endl;
	}
	cout<<ans2<<endl;
	return 0;
}

回复

2 条回复,欢迎继续交流。

正在加载回复...