洛谷 4933 洛谷10月月赛II T2 大师

【题解】

  f[i][j]表示最后一个数为h[i],公差为j的等差数列的个数。n方枚举最后一个数和倒数第二个数转移即可。注意公差可能为负数,需要移动为正数再作为下标。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define LL long long
 5 #define rg register
 6 #define N 1010
 7 #define Mod (998244353)
 8 #define P (20000)
 9 using namespace std;
10 int n,mx,ans,h[N],f[N][40010];
11 inline int read(){
12     int k=0,f=1; char c=getchar();
13     while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
14     while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();
15     return k*f;
16 }
17 inline void MOD(int &k){if(k>=Mod) k-=Mod;}
18 int main(){
19     n=read();
20     for(rg int i=1;i<=n;i++) h[i]=read();
21     for(rg int i=1;i<=n;i++){
22         ans++;
23         for(rg int j=i-1;j;j--){
24             f[i][h[i]-h[j]+P]+=f[j][h[i]-h[j]+P]+1; MOD(f[i][h[i]-h[j]+P]);
25             ans+=f[j][h[i]-h[j]+P]+1; MOD(ans);
26         }
27     }
28     printf("%d\n",ans);
29     return 0;
30 }

 

posted @ 2018-10-24 18:13  Driver_Lao  阅读(204)  评论(0编辑  收藏  举报