闫氏dp分析法

1、状态表示:指的是,以结尾的对3取余后值为j的集合
2、 方案数
3、集合划分:每次转移都是从

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<iostream>
using namespace std;
typedef long long ll ;
const ll mod = 1e9 + 7 ;
const int N = 1e3 + 10;
ll f[N][3] ;
char s[N];
int main()
{
    scanf("%s",s+1);
    int n = strlen( s + 1 );

    for( int i = 1 ; i <= n ; i ++ )
        f[i][(s[i]-'0')%3] = 1 ;
    for( int i = 1 ; i <= n ; i++ ){
        for( int j = 0 ; j < 3 ; j++ ){
            for( int k = i+1 ; k <= n ; k ++ ){
                f[k][(j+s[k]-'0')%3] = ( f[k][(j+s[k]-'0')%3] + f[i][j] ) % mod ;
            }
        }
    }
    ll ans = 0 ;
    for( int i = 1 ; i <= n ; i++ ){
        ans = ( ans + f[i][0] ) % mod ;
    }
    printf("%lld\n",ans);
    return 0;
}