题目链接:大师 - 洛谷
分析:这道题是一道动态规划题,感觉思路还是挺难想的,设dp[i][j]为合法方案中倒数第二个电塔为第i个电塔,倒数第一个电塔为第j个电塔,很显然的一点就是初始化dp[i][j]=1,然后我们开始枚举倒数第三个电塔,枚举条件就是倒数第二个电塔的高度减去倒数第三个电塔的高度等于倒数第一个电塔的高度减去倒数第二个电塔的高度,只要满足这个条件就可以进行动态转移,然后我们的答案就是所有的dp[i][j],但是最后不要忘记加上只有一个电塔的情况也就是加上n。
下面是代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
using namespace std;
const int N=1003,mod=998244353;
int f[N][N];//f[i][j]表示以i为倒数第二个和以j为倒数第一个的方案数
int h[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
scanf("%d",&h[i]);
long long ans=n;
for(int i=1;i<n;i++)
for(int j=i+1;j<=n;j++)
{
f[i][j]=1;
for(int k=1;k<i;k++)
{
if(h[k]-h[i]==h[i]-h[j])
f[i][j]=(f[i][j]+f[k][i])%mod;
}
ans=(ans+f[i][j])%mod;
}
printf("%lld",ans);
return 0;
}