等差数列CODEVS[2205]解题报告

思路:DP。设f[i][j]为以i为末项,j为公差的等差数列个数,则显然有f[i][j]+=f[k][a[k]-a[i]]+1
        但在这里,我犯了一个错误,是当公差为0的时候,长度为1的等差数列是否应算在f[i][0]中?
答案应该是否定的,
       因为,若欲在转移方程中+1,则意味着k是数列首项的情况不在f[i][j]中,但若将上述情况算在其中,则出现了矛盾,导致答案增大。 
代码:
 
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
int f[1000][5001];
int main(){
    const int down=1000;
    freopen("CODEVS2205.in","r",stdin);
    freopen("CODEVS2205.out","w",stdout);
    int i,j,N,ans=0,tmp,a[1000];
    scanf("%d",&N);
    for(i=0;i<N;++i){
        scanf("%d",a+i);
        for(j=i;--j>-1;){
            tmp=f[j][a[i]-a[j]+down]+1;
            f[i][a[i]-a[j]+down]=(f[i][a[i]-a[j]+down]+tmp)%9901;
            ans=(ans+tmp)%9901;
        }
    }
    printf("%d",(ans+N)%9901);
}

你可能感兴趣的:(dp)