线性dp
原文连接:https://ac.nowcoder.com/acm/problem/21302
dp[i][j]表示前i个数的余数j的个数
dp[i][k]+=(dp[i-1][k]+dp[i-1][(k+3-j)%3])%mod;
AC代码:
#include<iostream>
#include<string.h>
#include<vector>
#include<algorithm>
using namespace std;
string st;
int dp[55][3];
int mod=1e9+7;
void solve(){
int i,j,k;
memset(dp,0,sizeof(dp));
j=(st[0]-'0')%3;
dp[0][j]++;
for(i=1;i<st.length();i++){
j=(st[i]-'0')%3;
dp[i][j]++;dp[i][j]%=mod;
for(k=0;k<3;k++){
dp[i][k]+=(dp[i-1][k]+dp[i-1][(k+3-j)%3])%mod;
}
}
cout<<dp[st.length()-1][0]%mod<<endl;
}
int main(){
int i,j;
cin>>st;
solve();
return 0;
}