T3考场写了个半个记搜,不知道思路对不对,剪枝剪了一个半小时啥也没剪出来
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#define MAXN 100000000
using namespace std;
string ab;
int n,sz[10001],qk[3000][10001],k=1,ffmin=MAXN,fccc[10010];
map<string,int> jy;
map<long long,int>f__c;
void dfs(int a[])
{
for(int i=1;i<n-1;i++)
{
int u=a[i];
a[i]=a[i-1]+a[i+1]-a[i];
string aa;
for(int j=0;j<n;j++)
{
aa.push_back(a[j]+'0');
}
if(!jy.count(aa))
{
jy[aa]=1;
for(int kk=0;kk<n;kk++)
{
qk[k][kk]=a[kk];
}
double pjz=0,fc=0;
for(int j=0;j<n;j++)
{
pjz=pjz+qk[i][j];
}
pjz/=n;
for(int j=0;j<n;j++)
{
fc=fc+(qk[i][j]-pjz)*(qk[i][j]-pjz);
}
fc=fc*n;
int fcc=fc;
ffmin=min(ffmin,fcc);
fccc[i]=fcc;
if(f__c.count(fcc)) return ;
f__c[fcc]=1;
k++;
dfs(a);
}
a[i]=u;
}
}
int main()
{
// freopen("variance.in","r",stdin);
// freopen("variance.out","w",stdout);
cin>>n;
for(int i=0;i<n;i++) cin>>sz[i];
string ab;
for(int i=0;i<n;i++)
{
ab.push_back(sz[i]+'0');
}
jy[ab]=1;
dfs(sz);
for(int i=0;i<n;i++)
{
qk[0][i]=sz[i];
}
cout<<ffmin;
return 0;
}