DP #3,4,5 WA求调
查看原帖
DP #3,4,5 WA求调
699471
yuxiaoyu20090104楼主2023/8/8 17:27
#include<bits/stdc++.h>
using namespace std;
//f[i][j][k]表示区间[i,j]分成k段的最值
//f[i][j][k]=min/max(f[i][j-l][k-1]*s(j-l+1,j))s(i,j)即[i,j]的区间和 
//最终状态min/max(f[i][i+n-1][m])
int n,m,a[55],f1[55][105][15],f2[55][105][15],sum[105];
void init()
{
	memset(f1,0x3f3f3f3f,sizeof(f1));
	for(int i=1;i<=50;i++)
	{
		for(int j=i;j-i<50;j++)
		{
			f2[i][j][1]=f1[i][j][1]=((sum[j]-sum[i-1])%10+10)%10;
		}
	}
}
int main()
{
	//freopen("P1043_3.in","r",stdin);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
		a[n+i]=a[i];
	}
	for(int i=1;i<=2*n;i++)sum[i]=sum[i-1]+a[i];
	//for(int i=0;i<=2*n;i++)cout<<sum[i]<<" ";
	//cout<<endl;
	init();
	for(int i=1;i<=n;i++) 
	{
		for(int j=i+1;j-i<n;j++)
		{
			for(int k=2;k<=j-i+1;k++)
			{
				f1[i][j][k]=0x3f3f3f3f;
				for(int l=1;j-l-i+1>=k-1;l++)//要使左端个数大于等于k-1,才能分成k-1段 
				{
					f1[i][j][k]=min(f1[i][j][k],f1[i][j-l][k-1]*(((sum[j]-sum[j-l])%10+10)%10));
					f2[i][j][k]=max(f2[i][j][k],f2[i][j-l][k-1]*(((sum[j]-sum[j-l])%10+10)%10));
					//cout<<f1[i][j][k]<<" "<<i<<" "<<j<<" "<<k<<" "<<l<<endl;
				}
			}
		}
	}
	int ans1=0x3f3f3f3f,ans2=0;
	for(int i=1;i<=n;i++)
	{
		int j=i+n-1;
		ans1=min(ans1,f1[i][j][m]);
	//	cout<<i<<" "<<j<<" "<<f1[i][j][m]<<endl;
		ans2=max(ans2,f2[i][j][m]);
	}
	cout<<ans1<<endl<<ans2;
	return 0;
}
2023/8/8 17:27
加载中...