题目详情
题目分析:dp[i][k]表示以k为公差,a[i]为结尾的等差数列有多少个。而dp的过程是算以a[i]为结尾k为公差,a[1]到a[i - 1]所有以k为公差的等差数列个数的和。
#include <cstdio>
#define MOD 998244353
int n, ans, dp[1111][44444], a[1111];//因为公差可能为负,所以dp下标总体加20000。数组也要开两倍。
int main(){
scanf("%d", &n);
for (int i = 1; i <= n; i++) scanf("%d", a + i);
for (int i = 1; i <= n; i++){
for (int j = 1; j < i; j ++){
dp[i][a[i] - a[j] + 20000] = (dp[i][a[i] - a[j] + 20000] + dp[j][a[i] - a[j] + 20000] + 1) % MOD;//这里加一是因为没有考虑只有a[j]与a[i]的情况。所以要加上去。
ans = (ans + dp[j][a[i] - a[j] + 20000] + 1) % MOD;//边加边算答案。
}
}
printf("%d\n", (ans + n)% MOD);//之所以加n是因为上面的dp没有考虑元素为一个的情况。一个也是符合题意的。
}