dp被3整除的子序列

链接:https://ac.nowcoder.com/acm/problem/21302
来源:牛客网

给你一个长度为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: 无限制


这个题就是dp[i][j]代表的是前i个数,余数是j的个数,注意它可以是加上这一位,也可意识不加这一位
#include<iostream>
#include<algorithm>
#include<cstring> 
using namespace std;
const int maxn=1e3+100;
const int mod=1e9+7;
char a[maxn];
int dp[maxn][maxn];
int main(){
    scanf("%s",a);
    int len=strlen(a);
    dp[0][(a[0]-'0')%3]=1; 
    for(int i=1;i<len;i++){    
        dp[i][(a[i]-'0')%3]=(dp[i][(a[i]-'0')%3]+1);//自己一位 
        for(int j=0;j<=2;j++){
            dp[i][j]=(dp[i][j]+dp[i-1][j])%mod;//不加 
            dp[i][(j+a[i]-'0')%3]=(dp[i][(j+a[i]-'0')%3]+dp[i-1][j])%mod;//加上 
        } 
         
    } 
    cout<<dp[len-1][0]<<endl;    
}

 



posted @ 2021-03-02 22:43  哎呦哎(iui)  阅读(51)  评论(0编辑  收藏  举报