洛谷 P4933 大师(DP)

题目链接:https://www.luogu.com.cn/problem/P4933

 

方程的设计比较难想:

设f[i][j]表示等差数列的最后一个数的位置为i,公差为j的方案数。

 

转移的话:

枚举k从1到i,f[i][j]+=f[k][j]。

最后累加答案,注意ans+i的含义(一个及两个的方案数)。

 

AC代码:

 1 #include<cstdio>
 2 #include<iostream>
 3 using namespace std;
 4 const int N=1005;
 5 const int M=20000;
 6 const int mod=998244353;
 7 int n,ans;
 8 int h[N],f[N][M<<1];
 9 int main(){
10     scanf("%d",&n);
11     for(int i=1;i<=n;i++) scanf("%d",&h[i]);
12     for(int i=1;i<=n;i++){
13         ans=(ans+i)%mod;
14         for(int j=1;j<i;j++){
15             int now=h[i]-h[j];
16             ans=(ans+f[j][now+M])%mod;
17             f[i][now+M]=(f[i][now+M]+f[j][now+M]+1)%mod;
18         }
19     }
20     printf("%d",ans);
21     return 0;
22 }
AC代码

 

posted @ 2020-11-03 23:00  dfydn  阅读(87)  评论(0编辑  收藏  举报