链接:牛客
题目描述
给你一个长度为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: 无限制
代码(Java):
import java.util.Scanner;
public class Main {
static final int MOD=1000000007;
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
String str=cin.next();
char[] ch=str.toCharArray();
int[][] dp =new int[str.length()][3];
for(int i=0;i<ch.length;i++){
ch[i]= (char) ((char) (ch[i]-'0')%3);
}
dp[0][ch[0]%3]=1;
for(int i=1;i<ch.length;i++){
int temp=ch[i]%3;
dp[i][temp]=(dp[i][temp]+1)%MOD;//1~(i-1)都不选,只选第i个数字
for(int j=0;j<3;j++){
dp[i][j]=(dp[i][j]+dp[i-1][j]+dp[i-1][(j+3-ch[i])%3])%MOD;
//dp[i-1][j]:第i个数字不选,只选1~(i-1)的情况
// 选1~i的情况,若有dp[i-1][k]对于dp[i][j]使得(k+ch[i])%3==j,此时(j+3-ch[i])%3==k(0<=k<3)
}
}
System.out.println(dp[str.length()-1][0]);
}
}