题解
2026-10-07 17:04:51
发布于:上海
5阅读
0回复
0点赞
题意
给定一个长度为的数列,求出当子序列长度为时且构成等差数列的方案数
思路
时,方案数就为,时方案数为也就是长度为2的子序列个数,因为这两种情况必定构成等差数列。
当时,就有不同情况了。
假设三个数,当时它们满足条件。
因此我们定义为最后一个数为,该等差数列上一个数为且长度为的方案数
那该怎么得到呢,就是由加上每个满足条件的(也就是当还没加入这个等差数列时的方案数)
那么状态转移方程就是
代码实现
#include<iostream>
using namespace std;
typedef long long ll;
const int N=100;
const ll mod=998244353;
int n;
ll a[N],dp[N][N][N],ans[N];
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
for(int j=1;j<=n;j++)
dp[i][j][2]=1;
}
ans[1]=n;
ans[2]=n*(n-1)/2;
for(int k=3;k<=n;k++){
for(int i=1;i<=n;i++){
for(int j=1;j<i;j++){
for(int m=1;m<j;m++){
if(a[j]-a[m]==a[i]-a[j])
dp[i][j][k]=(dp[i][j][k]+dp[j][m][k-1])%mod;
}
}
}
}
for(int k=3;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<i;j++)
ans[k]=(ans[k]+dp[i][j][k])%mod;
for(int k=1;k<=n;k++){
printf("%lld ",ans[k]);
}
return 0;
}
这里空空如也





有帮助,赞一个