[luogu] P4933 大师

题目详情
题目分析:dp[i][k]表示以k为公差,a[i]为结尾的等差数列有多少个。而dp的过程是算以a[i]为结尾k为公差,a[1]到a[i - 1]所有以k为公差的等差数列个数的和。

#include 
#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没有考虑元素为一个的情况。一个也是符合题意的。
}

你可能感兴趣的:(算法,动态规划,算法,c++)