ABC E 求 hack
  • 板块学术版
  • 楼主Disjoint_cat
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/2/4 22:29
  • 上次更新2023/10/24 01:40:39
查看原帖
ABC E 求 hack
549499
Disjoint_cat楼主2023/2/4 22:29

const int N=5005;
const ll Inf=0x3f3f3f3f3f3f3f3f;
int n,m,x[N];
ll a[N],c[N],dp[N][N],dp1[N][N];
void dp2(int l,int r)
{
	int k=r-l+1;ll mi[N][N];
	for(int i=1;i<=k;i++)
		for(int j=i;j<=k;j++)
		{
			if(i==j)mi[i][j]=c[l+i-1];
			else mi[i][j]=min(mi[i][j-1],c[l+j-1]);
//			cout<<"mi["<<i<<"]["<<j<<"]="<<mi[i][j]<<" ";
		}
	for(int i=0;i<=k;i++)
		for(int j=0;j<=k;j++)dp1[i][j]=Inf;
	dp1[0][0]=0;
	for(int i=1;i<=k;i++)
		for(int j=0;j<=i;j++)
		{
			if(i<k)dp1[i][j]=dp1[i-1][j];
			if(j)dp1[i][j]=min(dp1[i][j],dp1[i-1][j-1]+mi[i-j+1][i]+a[l+i-1]);
		}
}
void Solve()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1;i<=n;i++)cin>>c[i];
	for(int i=1;i<=m;i++)cin>>x[i];
	dp2(1,n);
	//  for(int i=1;i<=n;i++)
	//  {
	//  	for(int j=0;j<=i;j++)
	// 		cout<<"dp1["<<i<<"]["<<j<<"]="<<dp1[i][j]<<' ';
	//  	cout<<endl;
	//  }
	memset(dp,0x3f,sizeof(dp));
	dp[0][0]=0;
	for(int i=1;i<=m;i++)
	{
		dp2(x[i-1]+1,x[i]);
		for(int j=i;j<=x[i];j++)
		{
			for(int p=1;p<=x[i]-x[i-1];p++)
				dp[i][j]=min(dp[i][j],dp[i-1][j-p]+dp1[x[i]-x[i-1]][p]);
		}
	}
	ll ans=Inf;
	for(int i=m;i<=n;i++)ans=min(ans,dp[m][i]);
	cout<<ans<<endl;
}

WA on sample 2:expected 533,found 751

2023/2/4 22:29
加载中...