zoukankan      html  css  js  c++  java
  • Luogu P4933 大师【dp】By cellur925

    题目传送门

    题目大意:给你一个序列,求子序列为等差数列的子序列个数。序列长度$n<=2000$,最高的塔高$v<=20000$。


    这种计数类的题,大概就是dp的套路了⑧。开始设计的是一个错误的状态:设$f[i][j]$为到前$i$个塔选了$j$个的方案数,但是我们再看一看就会发现这是错的,因为等差数列啊,我们并没有考虑公差鸭。所以我们再设计一个状态:设$f[i][j]$表示到第$i$个塔为止,公差为$j$的方案数。开始想的是$O(n^3)$算法 ,还要枚举公差,但是后来发现不需要特意枚举公差,只要枚举一个数的之前的数,直接用他们的公差即可。复杂度$O(n^2)$。

    因为公差可能有负数,所以我们再加上一个大数即可。

    开始不加快读竟然会T一个点,加了就A了??? 我佛了233.

    Code

    #include<cstdio>
    #include<algorithm>
    #define maxn 1090
    
    using namespace std;
    typedef long long ll;
    const ll moder=998244353;
    
    int n,fake=20000;
    int h[maxn];
    ll ans,f[maxn][40009];
    
    void re(int &x)
    {
        x=0;
        char ch=getchar();
        bool flag=false;
        while(ch<'0'||ch>'9') flag|=(ch=='-'),ch=getchar();
        while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
        x=flag ? -x : x;
    }
    
    int main()
    {
        re(n);
        for(int i=1;i<=n;i++) re(h[i]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<i;j++)
            {
                (f[i][h[i]-h[j]+fake]+=f[j][h[i]-h[j]+fake]+1)%=moder;
                (ans+=f[j][h[i]-h[j]+fake]+1)%=moder;
            }
        (ans+=n)%=moder;
        printf("%lld
    ",ans); 
        return 0;
    }
  • 相关阅读:
    js 与 jquery 事件对象 比较(转)
    orcle blob转换
    谷歌浏览器和IE下new Date()注意的一个小地方
    让网页在IE下淡入淡出 共17种效果
    SqlHelper的编写
    最授用的数据库连接语句 ado.net
    .NET C#获取当前网页地址信息
    JS设为首页加入收藏代码大全
    CSS进度条
    Convert.ToInt32()与int.Parse()的区别
  • 原文地址:https://www.cnblogs.com/nopartyfoucaodong/p/9847620.html
Copyright © 2011-2022 走看看