pat 乙级 1040. 有几个PAT(25)



代码注释 很详细 :

 

#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <cmath>
#include <cctype>
#include <string>
#include <cstring>
#include <algorithm>
#include <ctime>
using namespace std;

char pat[100005];
int dp_p[100005],dp_a[100005],dp_t[100005];
int main() 
{                                                   // 思路 如下:
	                                                  //         A   P    P    A    P    T 
    gets(pat);                                        //  dp_p   0   1    2    2    3    3    (有几个P)
    int len=strlen(pat);                              //  dp_a   0   0    0    2    2    2   (有几个PA)
    if (pat[0]=='P') {                                //  dp_t   0   0    0    0    0    2   (有几个PAT)
    	 dp_p[0]=1;                                   //  所以:
    }                                                 // 若当前位置为P  dp_p[i] = dp_p[i-1] + 1
    else dp_p[0]=0;                                   //           否则  dp_p[i] = dp_p[i-1]
                                                      //
    for (int i=1;i<len;i++) {                         // 若当前位置为A   dp_a[i] = dp_a[i-1] + dp_p[i-1]
    	if (pat[i]=='P') {                            //           否则  dp_a[i] = dp_a[i-1]
    		dp_p[i]=(dp_p[i-1]+1)%1000000007;         // 
    	}                                             // 若当前位置为T   dp_t[i] = dp_t[i-1] + dp_a[i-1]
    	else dp_p[i]=(dp_p[i-1])%1000000007;          //           否则  dp_t[i] = dp_t[i-1]  
    }

    dp_a[0]=0;

     for (int i=1;i<len;i++) {
    	if (pat[i]=='A') {
    		dp_a[i]=(dp_a[i-1]+dp_p[i-1])%1000000007;
    	}
    	else dp_a[i]=(dp_a[i-1])%1000000007;
    }

    dp_t[0]=0;

    for (int i=1;i<len;i++) {
    	if (pat[i]=='T') {
    		dp_t[i]=(dp_t[i-1]+dp_a[i-1])%1000000007;
    	}
    	else dp_t[i]=(dp_t[i-1])%1000000007;
    }

    cout<<dp_t[len-1];

    return 0;
}

提交代码:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值