题目:我是超链接
题解:
如果你要枚举公差的话,Emmm...应该是要n^3,但我们可以选择枚举末尾的两个数字,f[i][j]表示以a[i]为结尾,j为公差的个数
设计f[i][a[i]-a[j]]=Σ(f[j][a[i]-a[j]]+1),这样可以保证公差产生的数字在序列里存在,细节要注意,为了防止重复叠加,先不把自己和自己的数字算上
这提示我们设计状态的时候需要注意转移过程中的共同点
代码:
#include <cstdio>
#include <iostream>
using namespace std;
const int Mod=9901;
int f[1005][3005],a[1005];
int main()
{
int ans=0,n,i,j;
scanf("%d",&n);
for (i=1;i<=n;i++) scanf("%d",&a[i]);
for (i=1;i<=n;i++)
for (j=1;j<i;j++)
f[i][a[i]-a[j]+1000]=(f[i][a[i]-a[j]+1000]+f[j][a[i]-a[j]+1000]+1)%Mod;
for (i=1;i<=n;i++)
for (j=0;j<=3000;j++) ans=(ans+f[i][j])%Mod;
printf("%d",ans+n);
}