很明显的一个动态规划问题:后面的状态与前面的状态有关,dp[i][j]表示以i为结尾公差为j的等差数列的个数,所以状态转移方程就出来了。还有一个问题是公差为负的话考虑加上一个数,确保相减后的公差必为正数。
点击查看代码
#include <iostream>
#include <stack>
#include <cmath>
#include <algorithm>
#include <set>
#include <vector>
#include <climits>
#include <string.h>
#include <map>
#include <queue>
#include <list>
#include <cmath>
#include <iomanip>
#define int long long
#define ios ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define lc u<<1
#define rc u<<1|1
#define gcd __gcd
#define double long double
#define endl "\n"
#define INF LLONG_MAX
#define mod 998244353
#define N 2005
const double PI = 3.14159265358979323846;
using namespace std;
int n, a[N], ans,dp[N][N+40000];//dp[i][j]表示以i为结尾j为公差的等差数列的数量
signed main()
{
ios;
cin >> n;
ans = n;//单独的
for (int i = 1; i <= n; i++)cin >> a[i];
for (int i = 1; i <= n; i++)
{
for (int j = i - 1; j; j--)
{
dp[i][a[i] - a[j] + 20000] += dp[j][a[i] - a[j] + 20000] + 1;
dp[i][a[i] - a[j] + 20000] %= mod;
ans += dp[j][a[i] - a[j] + 20000] + 1;
ans %= mod;
}
}
cout << ans << endl;
return 0;
}