被3整除的子序列-Java

该博客介绍了如何使用Java解决一个算法问题:给定一个长度为50的数字串,找出所有能被3整除的子序列数量。博主通过分析数字与3的同余关系,提出动态规划的解决方案,并提供了具体的代码实现。
摘要由CSDN通过智能技术生成

题目描述

给你一个长度为50的数字串,问你有多少个子序列构成的数字可以被3整除
答案对1e9+7取模

输入描述:

输入一个字符串,由数字构成,长度小于等于50

输出描述:

输出一个整数

示例1

输入

132

输出

3

示例2

输入

9

输出

1

示例3

输入

333

输出

7

示例4

输入

123456

输出

23

示例5

输入

00

输出

3

备注:

n为长度
子任务1: n <= 5
子任务2: n <= 20
子任务3: 无限制

思路

  1. 只要所有数位数字的和可以被三整除,那么这个数字就能被3整除。
  2. 同余与模算术:(a+b) mod n=((a mod n)+(b mod n)) mod n
  3. 综合前面两点,可以得出把字符串的和取模3,处理成 每个数字取模3,再将它们的和取模3,那么每个数字的结果只有0 ,1 ,2这三种情况。

算法(动态规划)

二维数组dp[i] [j] 表示 前 i 个长度的所有子序列数位数字和取模 3 为 j 的数目( 0 <= j < 3)

有状态转移方程 :dp[i] [j] = (dp[i - 1] [j] + dp[i - 1] [ (j - m + 3) % 3]) % (1e9+7);

m=第i个数字取模3的结果。

实例:j=0 时,表示能被3整除。

dp[i] [0]可以由两种情况递推过来:

1.  第 i 个数字不用, 那么能被3整除的个数为 dp[i - 1] [0]。

2.  第 i 个数字与前边(i-1)个数字相接,即前(i-1)数字的和与i相加能被3整除的个数,即满足和为 ( j - m + 3) % 3 的所有子序列。

dp[i] [0] = (dp[i - 1] [0] + dp[i - 1] [ 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值