浙大PAT 甲级A1093 Count PAT‘s & 乙级B1040 有几个PAT(递推)

14 篇文章 0 订阅

PAT - A1093 Count PAT’s (25 分) https://pintia.cn/problem-sets/994805342720868352/problems/994805373582557184
PAT - B1040 有几个PAT (25 分) https://pintia.cn/problem-sets/994805260223102976/problems/994805282389999616
题目-英文题目-中文

大致思路:

(题意不难,但有时间限制,完全暴力处理不可取。这次自己想的算法比《算法笔记》给的貌似要好一些~)
从左往右扫描给定字符串序列,分别累计PPAPAT的数量(初值均为0;过程中完成取模),其中:

  • P:每遇到一次P加一即可;
  • PA:每次遇到A更新,为其前面已构成的"PA"的数量,加上由此A新形成的"PA"的数量(即此A前面所有的P的数量);
  • PAT:每次遇到T更新,为其前面已构成的"PAT"的数量,加上由此T新形成的"PAT"的数量(即此T前面所有的PA的数量);
通过代码(C/C++):
#include<stdio.h>

int main(){
    int num_p=0, num_pa=0, num_pat = 0;
    char ch=getchar();
    while(ch!='\n'){
        switch(ch){
        case 'P':   //遇到P更新P的数量
            num_p++;
            break;
        case 'A':   //遇到A更新PA的数量,新增量为此A之前所有的P的数量(与此A形成新的PA)
            num_pa=(num_pa+num_p)%1000000007;
            break;
        case 'T':   //遇到T更新PAT的数量,新增量为此T之前所有PA的数量(与此T形成新的PAT)
            num_pat=(num_pat+num_pa)%1000000007;
            break;
        }
        ch=getchar();
    }
    printf("%d\n", num_pat);
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值