萌新求助区间dp
查看原帖
萌新求助区间dp
173918
swl3992楼主2020/8/28 19:14
//#pragma GCC optimize(3,"Ofast","inline")
#include <bits/stdc++.h>
using namespace std;
int n;
int stone[250];
int sum[250];
int dp1[250][250];
int dp2[250][250];
void read(int &x)
{
	int num=0,f=1;
	char c;
	c=getchar();
	while(c<'0'||c>'9')
	{
		if(c=='-')
		{
			f=-1;
		}
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		num=(num<<3)+(num<<1)+(c^48);
		c=getchar();
	}
	x=f*num;
}
void print(int x)
{
	if(x<0)
	{
		x=-x;
		putchar('-');
	}
	if(x>=10)
	{
		print(x/10);
	}
	putchar(x%10+'0');
}
int main()
{
	//ios::sync_with_stdio(0);
	read(n);
	for(int i=1;i<=n;i++)
	{
		cin>>stone[i];
		stone[n+i]=stone[i];
	}
	for(int i=1;i<=2*n;i++)
	{
		sum[i]=sum[i-1]+stone[i];
	}
	for(int i=1;i<=2*n;i++)
	{
		for(int j=1;j<=2*n;j++)
		{
			dp1[i][j]=65536;
		}
	}
	for(int i=1;i<=2*n;i++)
	{
		dp1[i][i]=0;
	}
	for(int len=2;len<=n;len++)
	{
		for(int i=1;i+len-1<=2*n;i++)
		{
			int j=i+len-1;
			for(int k=i;k<j;k++)
			{
				dp1[i][j]=min(dp1[i][j],dp1[i][k]+dp1[k+1][j]+sum[j]-sum[i-1]);
				dp2[i][j]=max(dp2[i][j],dp1[i][k]+dp2[k+1][j]+sum[j]-sum[i-1]);
//				cout<<i<<" "<<j<<" "<<dp2[i][j]<<" "<<dp2[i][k]<<" "<<dp2[k+1][j]<<" "<<sum[j]<<" "<<sum[i-1]<<endl;
			}
		}
	}
//	for(int i=1;i<=n;i++)
//	{
//		cout<<dp1[i][i+n-1]<<" "<<dp2[i][i+n-1]<<endl;
//	}
	int ans1=2147483647,ans2=0;
	for(int i=1;i<=n;i++)
	{
		ans1=min(ans1,dp1[i][i+n-1]);
		ans2=max(ans2,dp2[i][i+n-1]);
	}
	print(ans1);
	puts("");
	print(ans2);
	return 0;
}

rt

错误数据:

46
16 4 14 12 0 3 11 8 18 2 6 8 6 7 13 7 8 14 11 2 16 12 16 0 8 1 3 10 7 16 0 16 11 17 13 18 5 15 0 12 19 0 0 5 3 1 

答案:

2087
10554

我的答案

2087
10483

求助大佬

2020/8/28 19:14
加载中...