被3整除的子序列
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int M = 5 * 1e4 + 10;
const int MOD = 1e9 + 7;
string str;
int dp[55][5];
int main() {
cin >> str;
dp[1][(str[0] - '0') % 3] = 1;
for (int i = 2; i <= str.length(); ++i) {
int k = (str[i - 1] - '0') % 3;
for (int j = 0; j <= 2; ++j) {
dp[i][j] = (dp[i - 1][j] + dp[i - 1][(3 + j - k) % 3]) % MOD;
}
dp[i][k] += 1;
}
cout << (dp[str.length()][0] % MOD) << endl;
return 0;
}
题解:线性dp板子题