正题
题目大意
有n个瓶子,将一个瓶子变成相邻一个瓶子的颜色价值为它们颜色值的乘积,求将所有瓶子变成同一个颜色的最低价值。
解题思路
枚举最后的剩下的颜色,然后对于每个瓶子只有两种可能
1.直接变成那个颜色
2.变成别的颜色在变成那个颜色
若我们要将X变成Z,而中间变成Y更优,我们可以判断
XZ<=XY+ZYXZ<=XY+ZYXZ<=XY+ZY
则Y<=X,Y<=ZY<=X,Y<=ZY<=X,Y<=Z
然后根据根据这个判断
code
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
ll a[310],f[310],n,maxs,t;
ll check(ll x)//判断
{ll s=0;memcpy(f,a,sizeof(f));for(ll i=1;i<n;i++)//往右合并if(f[i]!=x&&f[i+1]!=x&&f[i]>f[i+1]&&x*f[i+1]+f[i]*f[i+1]<x*f[i]){s+=f[i]*f[i+1];f[i]=f[i+1];}for(ll i=2;i<=n;i++)//往左合并if(f[i]!=x&&f[i-1]!=x&&f[i]>f[i-1]&&x*f[i-1]+f[i-1]*f[i]<x*f[i]){s+=f[i]*f[i-1];f[i]=f[i-1];}for(ll i=1;i<=n;i++)if(f[i]!=x) s+=f[i]*x;return s;
}
int main()
{scanf("%lld",&t);while(t--){scanf("%lld",&n);maxs=1e18;for(ll i=1;i<=n;i++)scanf("%lld",&a[i]);for(ll i=1;i<=n;i++)maxs=min(maxs,check(a[i]));printf("%lld\n",maxs);}
}