P4933 大师

很明显的一个动态规划问题:后面的状态与前面的状态有关,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;
}
posted @ 2024-10-19 13:58  Aloongyy  阅读(21)  评论(0)    收藏  举报