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

时间:2022-12-29 23:07:43

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;
}

提交代码:


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