楼上的大佬们已经把解析说得很详细了,我利用(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; }