dp被3整除的子序列
链接:https://ac.nowcoder.com/acm/problem/21302
来源:牛客网
给你一个长度为50的数字串,问你有多少个子序列构成的数字可以被3整除
答案对1e9+7取模
答案对1e9+7取模
输入描述:
输入一个字符串,由数字构成,长度小于等于50
输出描述:
输出一个整数
备注:
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; }