40pts 求助
查看原帖
40pts 求助
749714
xyzfrozen楼主2023/8/24 11:42
#include<bits/stdc++.h>
#define int long long
#define pt putchar(' ')
#define nl puts("")
#define pi pair<int,int>
#define pb push_back
#define go(it) for(auto &it:as[x]) //注意加了&
using namespace std;

const int N=55;
int n,a,b,ans=2e9;
int w[N],f[N][N][N],mx[N][N],mn[N][N];

int fr(){ //double 不能快读!!!!
    int x=0,flag=1;
    char ch=getchar();
    while(ch<'0' || ch>'9'){
        if(ch=='-') flag=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9'){
        x=x*10+(ch-'0');
        ch=getchar();
    }
    return x*flag;
}
void fw(int x){
	if(x<0) putchar('-'),x=-x;
    if(x>9) fw(x/10);
    putchar(x%10+'0');
}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}
int sqr(int x){return x*x;}

signed main()
{
	n=fr(),a=fr(),b=fr();
	for(int i=1;i<=n;i++) mx[i][i]=mn[i][i]=w[i]=fr();
	for(int len=2;len<=n;len++)
		for(int i=1,j=len;i+len-1<=n;i++,j++)
			mx[i][j]=max(mx[i+1][j],mx[i][j-1]),mn[i][j]=min(mn[i+1][j],mn[i][j-1]);
	
	//发完 [i,j],用了 k 次的最小代价
	memset(f,0x3f,sizeof f);
	for(int i=1;i<=n;i++) f[i][i][1]=a;
	for(int len=2;len<=n;len++)
		for(int i=1;i+len-1<=n;i++)
		{
			int j=i+len-1;
			for(int k=2;k<=len;k++)
				for(int l=i+1;l<j;l++)
					for(int r=l;r<j;r++)
						f[i][j][k]=min(f[i][j][k],f[l][r][k-1]+a+b*sqr(max(mx[i][l-1],mx[r+1][j])-min(mn[i][l-1],mn[r+1][j])));
			for(int p=i;p<=j;p++)
				for(int k=2;k<=len;k++)
					f[i][j][k]=min({f[i][j][k],f[i][p][k-1]+f[p+1][j][1],f[i][p][1]+f[p+1][j][k-1]});
			f[i][j][1]=a+b*sqr(mx[i][j]-mn[i][j]);
		}
	
	for(int k=1;k<=n;k++) ans=min(ans,f[1][n][k]);
	fw(ans);
	return 0;
}
2023/8/24 11:42
加载中...