因爲條件a[i-1] + a[i+1] ≥ 2 × a[i],可化簡成a[i+1]-a[i]>=a[i]-a[i-1]
所以最後求的數列一定是先遞減後不變後遞增的
我們將數從小到大排序 (a[i]<a[i+1])
考慮前i個數已經排完且符合條件,第i+1個數要符合條件只可能在最左端或最右端
考慮到只有60個數
•從小到大向兩側加數,dp[i][j][k][l][p]表示最左,次左,次右,最右的數的大小,以及最後一個數在左側還是右側
其實可以把p這一維刪掉,固定i爲最大值,轉移時滿足可以將最右邊換成最左邊即可。
大概此時dp[i][j][k][l]表示一邊最高爲i次高爲j 另一邊最高爲k次高爲l的數量
#include<bits/stdc++.h>
using namespace std;
const long long mod=1000000007;
long long n,i,i1,ans,ans1;
long long b[100],f[61][61][61][61];
int main()
{
cin>>n;
for (int i=1;i<=n;i++) {cin>>b[i];}
sort(b+1,b+1+n);
ans=1;
for (i=2;i<=n;i++)
if (b[i]==b[i-1]) ans=ans*i%mod; else break;
if (i==n+1) cout<<ans<<endl;
else
{ i1=i-1;
//cout<<i1<<endl;
f[i1][i1][i1][i1]=1;
for (int i=i1;i<=n;i++)
for (int j=i1;j<=i;j++)
for (int k=i1;k<=i;k++)
for (int k1=i1;k1<=i;k1++)
{ //cout<<i+1<<' '<<j<<' '<<k<<' '<<k1<<' '<<f[i][j][k][k1]<<endl;
if (i==n) {ans1=(ans1+f[i][j][k][k1])%mod; }
else
{
if (f[i][j][k][k1])
{ // cout<<f[i][j][k][k1]<<endl;
if (b[i+1]+b[j]>=b[i]*2) f[i+1][i][k][k1]=(f[i+1][i][k][k1]+f[i][j][k][k1])%mod;
//cout<<i+1<<' '<<i<<' '<<k<<' '<<k<<' '<<k1<<endl;
if (b[i+1]+b[k1]>=b[k]*2) f[i+1][k][i][j]=(f[i+1][k][i][j]+f[i][j][k][k1])%mod;
}
}
}
cout<<(ans1*ans)%mod<<endl;
}
}