首页 > 其他分享 >AtCoder Beginner Contest 253 E

AtCoder Beginner Contest 253 E

时间:2023-09-22 20:11:38浏览次数:35  
标签:AtCoder Beginner Contest int ll 253 dp

AtCoder Beginner Contest 253

E - Distance Sequence

思路:前缀和优化DP

要求$ |a[i]-a[i+1]|>=k\( 定于\)dp[i][j]:\(前\)i\(个数以\)j\(结尾的合法序列数列 \) dp[i][j] += dp[i-1][1~(j-k)]+dp[i-1][(j+k)~m]$

直接写的话复杂度是\(O(nm^2)\)的会TLE,我们发现可以做一个前缀和优化,预处理出上一层的\(dp\)数组的前缀和。

// AC one more times
// nndbk
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod = 998244353;

ll n,m,k;
ll dp[1100][5100],s[5500];
int main()
{
    ios::sync_with_stdio(false);   cin.tie(nullptr), cout.tie(nullptr);
    cin>>n>>m>>k;
    /*
        |a[i]-a[i+1]|>=k
        dp[i][j]:前i个数以j结尾的合法序列数列
        dp[i][j] += dp[i-1][1~(j-k)]+dp[i-1][(j+k)~m]
    */
    for(int i = 1;i <= m; i++)
        dp[1][i] = 1;
    for(int i = 2;i <= n; i++)
    {
        for(int j = 1;j <= m; j++)
            s[j] = (s[j-1]+dp[i-1][j])%mod;

        for(int j = 1;j <= m; j++)
        {
            //这段代码会T
            // for(int l = 1;l <= j-k; l++)
            // {
            //     dp[i][j] += dp[i-1][l];
            //     dp[i][j] %= mod;
            // }
            // for(int l = j+k;l <= m; l++)
            // {
            //     dp[i][j] += dp[i-1][l];
            //     dp[i][j] %= mod;
            // }

            ll l = j-k,r = j+k;
            if(k==0)
                dp[i][j] += s[m],dp[i][j] %= mod;
            else{
                if(l>=1)
                    dp[i][j] += s[l],dp[i][j] %= mod;
                if(r<=m)
                    dp[i][j] = (dp[i][j]+(s[m]-s[r-1])%mod+mod)%mod;
            }
        }
    }
    ll ans = 0;
    for(int i = 1;i <= m; i++)
        ans += dp[n][i],ans %= mod;
    cout<<ans<<"\n";
    return 0;
}

标签:AtCoder,Beginner,Contest,int,ll,253,dp
From: https://www.cnblogs.com/nannandbk/p/17723251.html

相关文章

  • AtCoder Beginner Contest 313 Ex Group Photo
    洛谷传送门AtCoder传送门考虑若重排好了\(a\),如何判断可不可行。显然只用把\(b\)排序,把\(\min(a_{i-1},a_i)\)也排序(定义\(a_0=a_{n+1}=+\infty\)),按顺序逐个判断是否大于即可。这启示我们将\(\min(a_{i-1},a_i)\)排序考虑。考虑从大到小加入\(a_i\),那么......
  • 学习CC2530单片机(一)开发资料及开发环境搭建
    文件内容:CC2530数据手册.pdfSmartRF.exeIAREWFor8051.exe注册机.exe百度网盘 提取码:06wjSmartRF请自行安装,不再提供教程。下面是IAR安装教程:  这里一定要断网!这里先别动,打开注册机软件:这一步要把激活信息文件保存起来,最好选择一个方便找......
  • AtCoder Grand Contest 017
    链接C.SnukeandSpells容易发现合法序列排序后一定是若干段值域连续的部分组成:可以发现最小次数就是重叠/空出的部分大小。每次修改只会对\(O(1)\)个点\(±1\),直接维护即可。#include<iostream>#include<cstdio>#include<cstring>#include<vector>#defineN200010......
  • AtCoder Grand Contest 023 E Inversions
    洛谷传送门AtCoder传送门首先将\(a\)从小到大排序,设\(p_i\)为排序后的\(a_i\)位于原序列第\(p_i\)个位置,\(x_i\)为要填的排列的第\(i\)个数。设\(A=\prod\limits_{i=1}^n(a_i-i+1)\),则\(A\)为排列的总方案数(考虑按\(a_i\)从小到大填即得)。套路地,统......
  • Atcoder Regular Contest 165(A~E)
    赛时45min切A~C,降智不会D,罚坐1h,喜提rk70+->rk170+。A-SumequalsLCM可证明结论:若\(N\)只含有一种质因子则无解,否则有解。B-SlidingWindowSort2这么多cornercase的题竟然10min一发入魂,类目了。由于操作是升序排序,且要求最终字典序最大,所以如果存在一个......
  • AtCoder Beginner Contest 320
    A-LeylandNumbera,b=map(int,input().split(''))print(a**b+b**a)B-LongestPalindromes=input()n=len(s)res=0forlinrange(1,n+1):foriinrange(0,n-l):t=q=s[i:i+l]t=t+t[::-1]......
  • [ARC119F] AtCoder Express 3
    题目链接观察样例1的解释,发现切换类型的方法是比较单一的这种就是直接走一段换一段,我们可以人为钦定换乘时最多走一步,因为相邻的同色也可以视作走车站这种情况复杂一些,需要往回走一段,但是依然可以发现往回走也至多一步,因为如果走了两步说明往回走了一步到达的车站依......
  • 【杂题乱写】AtCoder-ARC113
    AtCoder-ARC113AA*B*C枚举\(A,B\),那么\(C\in[1,\left\lfloor\frac{K}{AB}\right\rfloor]\),时间复杂度是\(O(K\logK)\)。提交记录:Submission-AtCoderAtCoder-ARC113BA^B^C\(A^k\)的末尾存在循环节,找到循环节长度\(|T|\),答案就是\(A^{B^C\bmod|T|}\bmod10\)。提......
  • 【题解】AtCoder-ABC320
    AtCoder-ABC320ALeylandNumber依题意计算。提交记录:Submission-AtCoderAtCoder-ABC320BLongestPalindrome直接\(O(n^2)\)枚举,\(O(n)\)判断。提交记录:Submission-AtCoderAtCoder-ABC320CSlotStrategy2(Easy)不妨将字符串复制三遍,枚举\([0,3m)\)判断。提交......
  • abc253F - Operations on a Matrix
    F-OperationsonaMatrix初看起来感觉不是很好搞,主要是有赋值操作,我们需要知道的是最近一次在这个行上的赋值操作以及之间的贡献那么我们离线处理,每个3操作都往前找一个最近的同行2操作,然后两个做差就能得到中间的和。#include<algorithm>#include<cstdio>#include<cstrin......