思路
首先研究下此题目的状态空间,比如132这个集合{1,3,2,12,13,23,132}在这个状态集合中寻找能被3整除的数量(即各个数相加和能被3整除),那么如何设计存储这个状态空间以及状态如何转移呢,比如现在字符串为13的状态空间为{1,3,13},后面添加个字符串即在此状态空间基础上每个状态都加一个后面的字符串,最后加上那个字符串本身。那么这样可构思出如何存储状态空间。
f[ i ] [ j ]:表示进行到第i个字符串时,%3为j数的个数
那么f[i][j]的数可由f[i-1][j]得出,将第i个字符串加入集合时,依次遍历i-1集合空间
中的个数。
#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
const int N = 55,M=1e9+7;
typedef long long ll;
ll f[N][3];
int main()
{
string s;cin >> s;
int len = s.length();
f[0][(s[0] - '0') % 3] = 1;
for (int i = 1; i < len; i++)
{
int k = (s[i] - '0') % 3;
f[i][k] = 1;
for (int j = 0; j < 3; j++)
{
f[i][j] += f[i - 1][j];
f[i][(j + k) % 3] = (f[i][(j + k) % 3] + f[i - 1][j]) % M;
}
}
cout << f[len - 1][0];
return 0;
}