bjyb


私信TA

用户名:dotcpp0610982

访问量:1418

签 名:

等  级
排  名 2063
经  验 2391
参赛次数 0
文章发表 23
年  龄 0
在职情况 学生
学  校
专  业

  自我简介:

解题思路:建立dp[i][j],代表以i结尾,余数是j的所有子序列,
转移方程:dp[i][k]=∑dp[j][w];(if(w+s[i])%3==k)
             dp[i][k]+=1;(if(s[i])%3==k) (处理单个数字结尾)
依照此转移,时间复杂度平方级别,空间复杂度线性。
注意事项:子序列可以不连续。
参考代码:
#include<bits/stdc++.h>
using namespace std;
#define mod 1000000007
#define int long long
int dp[60][3];
int ans;
string s;
signed main()
{
  cin>>s;
  for(int i=0;i<s.size();++i)
  {dp[i][(s[i]-'0')%3]=1;
   for(int j=0;j<i;++j)
    for(int k=0;k<=2;++k)
    dp[i][(k+(s[i]-'0'))%3]=(dp[j][k]+dp[i][(k+(s[i]-'0'))%3])%mod;
   }
   for(int i=0;i<s.size();++i) ans=(ans+dp[i][0])%mod;
  cout<<ans;
}


 

0.0分

1 人评分

看不懂代码?想转换其他语言的代码? 或者想问其他问题? 试试问问AI编程助手,随时响应你的问题:

编程语言转换万能编程问答  

代码解释器

代码纠错

SQL生成与解释

  评论区