首页 > 其他分享 >iwtgm-15

iwtgm-15

时间:2023-11-05 23:35:43浏览次数:37  
标签:字符 15 后面 iwtgm 当前 情况 Mex dp

题目链接
这个dp题还是想多说一点,感觉之前写的还是不够清晰和透彻
先提一嘴,感觉这个dp不同于一般的dp,不是从1递推到n,个人理解更像是桶,后面会有很神奇的转移,真的太巧妙了
先解决一些局部问题吧
首先来想想重复的情况
如:0,1,1
这个例子中1是重复的,我们的dp转移状态是dp[i][0]+=dp[i][0]
注意这里是+=,可以这样理解:原来的情况其实被保存下来了,然后再把当前字符加到原来的所有情况中,那么就又出现了dp[i][0]个情况
我们选序列出来可以是不连续的嘛,所以所有情况记录下来再加上当前字符实际上满足了这个限制
比如说现在是第5个字符,前面只有1个字符的情况被保留了下来,我现在加上这个字符,就有一种情况是1,5,满足不连续取的操作,好,这个就说到这里

然后说是序列有两种情况,用dp[i][0/1]来表示
0,0,1,1,2,2这种递增的情况
考虑它的dp转移状态:
dp[i][0]+=dp[i][0];这个转移的是重复字符,如果这个字符已经出现过,那么在之前的所有情况上再加上现在的1个字符,那么就又出现了dp[i][0]这么多的情况
dp[i][0]+=dp[i-1][0]:前面我们提到桶的概念,假设0,1,1,用桶来解释就是0是dp[0][0],两个1都在dp[1][0]里面,相当于现在直接把当前的1放在0的后面,是重复元素的第一个,显然不与前面的情况重复(前面的情况0后面至少会有1个1,因为我们在转移状态的时候当前字符是必取的)

然后考虑这种:0,0,1,1,3,3,1,1,3,3
当我们开始不以1来递增的时候,现在取的必然是大的那个数,后面出现的数只能是大的数和前一个数
在这里提一嘴以1开头的,因为我们可以把它归结到第二种状态,请往下看:
在后面的代码部分,我们会把输入的值+1,为什么呢,因为这样操作会更简单,理由再往下看:
0开头是一般情况,因为这个时候这个Mex是比当前数大的,事实上第一种状态的时候,Mex都是比当前出现过的所有数大,把0归为第一种
以1开头,Mex比当前数也就是1小,先通俗地说,后面只能取1了,取其他都不行
因为这种情况下,我们Mex是不能取的,只能取比Mex大1的数,和比Mex小1的数
这里的话Mex=0,1是较大的那个数,-1是较小的那个数,而我们只要非负整数,所以-1不能取,所以可以把1归结为第二种情况了吧
所以我们把输入的值+1就可以不用特判1,让dp转移更具有普遍性
如这个例子,我们开始取3了(没有取2),那么我们后面再取数只能是1和3了
考虑它的dp转移:
dp[i][1]+=dp[i][1];这个理由与前面一样
dp[i+2][1]+=dp[i+2][1];
相当于这个例子吧:1,3,3,1,此时我们有哪些贡献呢,
第一个dp状态相当于这样:1,1,3,3,已经计算过了
此时就是1,3,3,1,加在3的后面,也就是dp[i+2][1],只是把这些贡献放在dp[i+2][1]里,这里可以看出用桶其实一直是升序状态,并没有保持原序列的样子,但其实顺序不是太重要,不影响。因为在后面加数,前面满足的情况都会被加上,位置在哪儿无所谓
第三个dp状态:if(x>1) dp[i][1]+=dp[i-2][0];
与dp[i][0]+=dp[i-1][0]这个情况原理类似,让当前字符成为重复字符的第一个(前面是其他字符)

好了,至此代码说明完毕。
它就是灵活了位置,不是一般的从前往后推,这样的确计数非常高效,去看其他正常递推的是在是复杂且难以理解。

一样的代码,再贴一次吧
注释是之前写的,写得不明白的可以适当忽略

ll dp[N][2];
const int mod=998244353;
void solve()
{
    int n;cin>>n;
    for(int i=0;i<=n+1;i++){
        dp[i][0]=0;dp[i][1]=0;
    }
    dp[0][0]=1;//初始化,因为0和1可以作为开头
    for(int i=1;i<=n;i++){
        int x;cin>>x;x++;//加1操作后会比较方便,因为1可以作为开头,但它后面就只能一直取1,因为比它小2的是负数,取不了,它相当于是第二种情况
        dp[x][0]+=dp[x][0]+dp[x-1][0];//等号右边的第一项是当前字符已经存在的所有情况,是把x加在这些情况后面。第二项是当前字符直接加在x-1后面,相当于重复的第一个
        dp[x][1]+=dp[x][1];//当前字符是第二种情况,可以加一倍
        dp[x+2][1]+=dp[x+2][1];//就是在原来的所有情况上加上这个字符,写成[x+2]是桶的性质,可以这样等价,所以说是不大正常的dp
        if(x>1)dp[x][1]+=dp[x-2][0];//把当前的字符当作第二种情况的开头,所以x-1是第一种情况的时候,也就是说,第二种情况的0,1,3,1 其实可以等价转化为:0,1,1,3,用桶计数
        dp[x][0]%=mod;
        dp[x][1]%=mod;
        dp[x+2][1]%=mod;
    }
    ll ans=0;
    for(int i=1;i<=n+1;i++){
        ans+=dp[i][0]+dp[i][1];
        ans%=mod;
    }
    cout<<ans<<endl;
}

标签:字符,15,后面,iwtgm,当前,情况,Mex,dp
From: https://www.cnblogs.com/wwww-/p/17811550.html

相关文章

  • C++_15_友元函数和友元类 - 重写版
    友元函数和友元类友元函数:通过friend关键字,将不属于当前类的函数在当前类中加以声明,使其成为友元函数,同时该函数能够访问private属性的成员变量。友元类:有有元函数,自然也能有友元类,通过friend关键字,将类A在类B中声明,那么类A会成为类B的友元类注意:1、友......
  • iwtgm-14
    没时间了,只补了一个小题,自己尝试证明了下结论哈哈,还挺不错的华中D把线分成两种:一种是只影响一个正方形的,就是最外围的那一圈,是偶数条一种是影响两个正方形的(公共边),也是偶数条已知偶数位是必胜态后手只要跟着先手走,先手选最外围的走,后手就选最外围的走,先手选公共边走,后手就......
  • 2023-2024-1 20231415 《计算机基础与程序设计》第六周学习总结
     这个作业属于哪个课程https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP/这个作业要求在哪里https://www.cnblogs.com/rocedu/p/9577842.html#JXJC这个作业目标是什么本周学习计算机科学概论第7章和《C语言程序设计》第5章的相关内容,并对两本教材进行总结......
  • 2023-2024-1 学号20231315第六周学习总结
    学期:2023-2024-1学号:20231315《计算机基础与程序设计》第五周学习总结作业信息这个作业属于哪个课程2023-2024-1《计算机基础与程序设计》这个作业要求在哪里2023-2024-1《计算机基础与程序设计》这个作业的目标学习计算机科学概论第7章和《C语言程序设计》第5......
  • Java 操作 XML(15)--XOM 使用
    XOM是一个面向对象的XMLAPI,有点像DOM风格,但是许多功能使XOM与众不同,其中最主要的是严格维护内存对象中的不变性,以便始终可以将XOM实例序列化以更正XML。本文主要介绍使用XOM处理XML,文中所使用到的软件版本:Java1.8.0_341、XOM1.3.9。1、简介XOM被设计成易于学习和......
  • 110115
    一场比赛中共有 n 支队伍,按从 0 到  n-1 编号。给你一个下标从 0 开始、大小为 n*n 的二维布尔矩阵 grid 。对于满足 0<=i,j<=n-1 且 i!=j 的所有 i,j :如果 grid[i][j]==1,那么 i 队比 j 队 强 ;否则,j 队比 i 队 强 。在这场比赛......
  • 【杂题乱写】AtCoder-ARC115
    AtCoder-ARC115_FMigration*把问题转化成在某个限制\(mid\)下求初始局面和最终局面能到达的最小代价局面,如果相等则说明可达。比较局面的方式是比较权值,如果相等按字典序比较。对每个节点\(u\)求出权值比\(u\)小或权值与\(u\)相等且编号比\(u\)小的节点中,与\(u\)......
  • P1156 垃圾陷阱
    P1156垃圾陷阱基本思路[受这题的影响](P2370yyy2015c01的U盘-加固文明幻景-博客园(cnblogs.com)),我总觉得这题不应该直接把时间当作状态方程的值,于是搞了\(F[i][j]\),为前\(i\)个物品,前\(j\)时间内能到达的最大高度,然后又搞一个数组维护最优时间,但我的能力根本行不通。......
  • 苹果iOS 17.2年底推送:iPhone 15 Pro的自定义操作按钮功能升级
    据报道,苹果会在年底推送iOS17.2版本,新版系统将会修复iPhone15系列WiFi速度慢的问题。与此同时,iOS17.2将会带来翻译功能,iPhone15Pro的自定义操作按钮切换到翻译选项后,按住会弹出一个翻译窗口,用于翻译设备听到的语音内容。除此之外,这枚自定义操作按钮还可以设置为其它很多功......
  • 150. 逆波兰表达式求值
    150.逆波兰表达式求值题目描述给你一个字符串数组tokens,表示一个根据逆波兰表示法表示的算术表达式。请你计算该表达式。返回一个表示表达式值的整数。注意:有效的算符为'+'、'-'、'*'和'/'。每个操作数(运算对象)都可以是一个整数或者另一个表达式。两个整数之间的除法总......