NC50 E

烈酒焚心 提交于 2019-11-28 10:28:10

这什么垃圾数据一堆贪心的我随手就能卡掉。
我们考虑dp
先考虑有多少段叭,然后考虑每一段是不是0,
然后就得到递推式
如果当前串是0
dp[i][0]=dp[i-1][0]+dp[i-1][1],//我们把这个0拿出来,与前面所有的方案都形成一种新方案
dp[i][1]=dp[i-1][1];//直接拼上去
如果不是0
dp[i][0]=0;
dp[i][1]=dp[i-1][1]*2+dp[i-1][0];//对于dp[i-1][1]来说拼或者不拼,对于dp[i-1][0]来说只能不拼。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll mod = 998244353;
int n;string s;
bool ning[100005];int cnt=0;
ll dp[100005][2];
int main(){
    ios::sync_with_stdio(false);
    cin>>n>>s;s="*"+s;
    int tmp=0,len=0;
    for(int i=1;i<=n;i++){
        tmp=(tmp+s[i]-'0')%3;
        len++;
        if(!tmp){
            ning[++cnt]=(len==1&&s[i]=='0');
            len=0;
        }
    }
    if(tmp)cout<<0<<endl;
    else{
        dp[0][0]=1;dp[0][1]=0;
        for(int i=1;i<=cnt;i++){
            if(ning[i]){
                dp[i][1]=dp[i-1][1];
                dp[i][0]=(dp[i-1][0]+dp[i-1][1])%mod;
            }else{
                dp[i][0]=0;
                dp[i][1]=(dp[i-1][1]*2+dp[i-1][0])%mod;
            }
        }
        cout<<(dp[cnt][0]+dp[cnt][1])%mod;
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!