• c_pat_PAT 计数(累加上一种字符的方案数)


    字符串 APPAPT 中共包含两个 PAT 作为子串。
    第一个子串由第二,第四和第六个字符组成,第二个子串由第三,第四和第六个字符组成。
    现在给定一个字符串,请你求出字符串中包含的 PAT 的数量。

    思路
    这里为了方便,默认 p 前面跟的是 ' ',
    f[i][0]表示当前位置为i,且为字符空格时的PAT串的个数
    f[i][1]表示当前位置为i,且为字符 P 时的PAT串的个数
    f[i][2]表示当前位置为i,且为字符 A 时的PAT串的个数
    f[i][3]表示当前位置为i,且为字符 T 时的PAT串的个数

    则,f[i][j]+=f[i-1][j-1],if(s[i]=c[j]),每种合法情况都累加上前一种字符的方案数

    #include<bits/stdc++.h>
    using namespace std;
    const int mod=1e9+7, c[4]={' ','P','A','T'};
    int main() {
        std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
        string s; cin>>s;
        int n=s.size(), f[n+1][4]; 
        memset(f, 0, sizeof f); f[0][0]=1;
        
        for (int i=1; i<=n; i++)
        for (int j=0; j<4; j++) {
            f[i][j]=f[i-1][j];
            if (s[i-1]==c[j])
                f[i][j]=(f[i][j]+f[i-1][j-1])%mod;
        }
        cout<<f[n][3];   
        return 0;
    }
    

    别人的更优秀的解法,感觉自己空间O(n)的解法像一坨...

    #include<bits/stdc++.h>
    using namespace std;
    const int mod=1e9+7;
    int main() {
        std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
        string s; cin>>s;
        int n=s.size(), p=0, a=0, ans=0; 
        
        for (int i=0; i<n; i++) {
            if (s[i]=='P') p++;
            else if (s[i]=='A') a+=p;
            else ans=(ans+a)%mod;
        }
        cout<<ans;
        return 0;
    }
    
  • 相关阅读:
    Redis基础学习(三)—Key操作
    Redis基础学习(二)—数据类型
    Redis基础学习(一)—Redis的安装
    Bootstrap基础学习(二)—表单
    Bootstrap基础学习(一)—表格与按钮
    List去除重复的元素
    jQuery 将表单序列化为Json对象
    SpringMVC基础学习(三)—参数绑定
    CentOS 7.1安装Elasticsearch和Storm
    Python多线程中join函数与setDaemon函数使用说明
  • 原文地址:https://www.cnblogs.com/wdt1/p/13698768.html
Copyright © 2020-2023  润新知