楼上的大佬们已经把解析说得很详细了,我利用(a==b)的返回值把状态方程优化了一下。

#include<bits/stdc++.h>
using namespace std; 
const int mod = 1e9 + 7;
int main()
{
    int dp[55][3];
    int m = 0;
    memset(dp, 0, sizeof(dp));
    string a;
    cin>>a;

    m = (a[0] - '0') % 3;
    dp[0][m] = 1;

    for(int i = 1; i < a.length(); i++){
        m = (a[i] - '0') % 3;
        for(int j = 0; j < 3; j++){
            dp[i][j] = (dp[i - 1][j] + dp[i - 1][(j - m + 3) % 3] + (j == m)) % mod;
        }
    }

    printf("%d",dp[a.length() - 1][0] % mod);
    //system("pause");
    return 0;
}