```cpp
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<cassert>
#include<vector>
#include<set>
#include<chrono>
#include<cstring>
#include<unordered_map>
#include<map>
#include<bits/stdc++.h>
using namespace std;
template<typename T>
inline bool cmin(T& x,const T& y){return y<x?x=y,1:0;}
template<typename T>
inline bool cmax(T& x,const T& y){return x<y?x=y,1:0;}
typedef long long ll;
typedef pair<int,int> pii;
typedef vector<int> vi;
typedef vector<vector<int> > vii;
typedef unsigned int ui;
typedef unsigned long long ull;
#define X first
#define Y second
const int MAXN=50+10;
int a[MAXN],b[MAXN];
int F[MAXN][MAXN];
int main()
{
// freopen("1.txt","r",stdin);
// freopen("1.out","w",stdout);
// cerr<<(double)13/24<<' '<<(double)8/15<<'\n';
ios::sync_with_stdio(0);cin.tie(0),cout.tie(0);
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=n;i++)cin>>b[i];
int tot=0;
tot=1;
for(int i=2;i<=n;i++)
{
if(a[i]==a[i-1])
{
b[tot]+=b[i];
}
else a[++tot]=a[i],b[tot]=b[i];
}
n=tot;
for(int len=1;len<=n;len++)
{
for(int l=1;l+len-1<=n;l++)
{
int r=l+len-1;
if(l==r)
{
F[l][r]=b[l]*b[l];
continue;
}
if(a[l]==a[r])
{
int sum=b[l],ans=0;
int la=l;
for(int k=l+1;k<=r;k++)
{
if(a[l]==a[k])
{
ans+=F[la+1][k-1];
sum+=b[k];
la=k;
}
}
cmax(F[l][r],ans+sum*sum);
}
for(int k=l;k<r;k++)cmax(F[l][r],F[l][k]+F[k+1][r]);
}
}
cout<<F[1][n];
return 0;
}
```
by __stick @ 2022-11-16 17:01:04
@[__stick](/user/571229) 你这个数据之所以会输出43,是因为你有相邻的块颜色相同,这个题目是不是应该保证给的相邻块颜色不同啊,反正那个把数据改成
```
3
1 3 2
4 5 7
```
就跑的没有问题,你要说硬改的话,再加个合并相邻相同的就好了
by LgxTpre @ 2023-03-26 14:25:38