1745 Divisibility DP

来源:互联网 发布:1password mac 许可证 编辑:程序博客网 时间:2024/05/23 01:15

判断若N个数的运算和是否等于k,每次运算或+或-,如果单纯地去运算,由于N比较大,每个数的范围也比较大,记录用的数组需要开到时间很大,内存肯定不够,而且利用率很低,时间效率也非常低

考虑模运算,若这N个数通过运算和能等于k,那么每个数模k后再做同样的运算得到的结果肯定为k的整数倍((a+b)%m=(a%m+b%m)%m),由于k不大(2<=k<=100),这样就可以记录每次运算完一个数之后那些余数可以取到

即如果opt[i-1][j]=1则opt[i][((j+num[i])%k+k)%k]=1,opt[i][((j-num[i])%k+k)%k]=1,如果事先对num[i]模k,状态转移可以简单一些

我用滚动数组实现,opt[0][105]和opt[1[105]]交替表示第i次的结果

但有点悲剧的是,把从第二个开始的k的整数倍去掉再DP就死活不过,不知道为什么=。=

 


原创粉丝点击