[ABC163E] Active Infants

dolphina發表於2024-06-27

能夠發現我每次把最大的放兩邊會比較好,但是不知道放哪邊,因為放不同的邊給後續帶來的影響不同

只能DP,能夠發現一堆數假設放最右邊都比較優秀,那顯然這堆數在最右邊怎麼擺放,所帶來的距離都是相等的,但是由題目可知,距離前乘上\(a[i]\)這個量,顯然我讓大的\(a[i]\)前面乘以的距離多會更優秀

那麼就是從小到大去討論放左邊還是右邊比較好,因為當前這個數放左端還是右端,會影響到後面的決策。對於當且掃描到最大的,要麼左,要麼右,之間DP一波就行了

5 5 6 1 1 1就是這樣的,可以手%,正確的是6 1 1 1 5 5

然後就是傻逼區間DP

#include<bits/stdc++.h>
#define vd void 
#define int long long 
#define pr std::pair<int,int>
#define fi first
#define se second 
int gi(){
	char c;int x=0,f=0;
	while(!isdigit(c=getchar()))f|=(c=='-');
	while(isdigit(c))x=(x*10)+(c^48),c=getchar();
	return f?-x:x;
}
template<class T>vd cxk(T&a,T b){a=a>=b?a:b;}
int n,dp[5001][5001];
pr a[5005];
signed main(){
	n=gi();for(int i=1;i<=n;i++)a[i].fi=gi(),a[i].se=i;
	sort(a+1,a+n+1);
	for(int i=1;i<=n;i++)
		for(int st=1;st+i-1<=n;st++){
			int ed=st+i-1;
			cxk(dp[st][ed],dp[st+1][ed]+std::abs(a[i].se-st)*a[i].fi);
			cxk(dp[st][ed],dp[st][ed-1]+std::abs(a[i].se-ed)*a[i].fi);
		}
	printf("%lld\n",dp[1][n]);
	return 0;
}

相關文章