题目地址
http://codeforces.com/problemset/problem/894/A
题意
给出一个字符串s,长度为n,其中n<100。
求s中QAQ 子序列 出现的个数。因为是子序列不是子串,所以可以是不连续的。
动态规划问题。
解决思路:
设置dpQ数组,存储到i为止Q出现的次数。
设置dpQA数组,存储到i为止QA出现的次数
设置dpQAQ数组,存储到i为止QAQ出现的次数
找出转移方程
AC代码如下
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
typedef long long LL;
typedef long long ll;
const int maxn = 1e6+6;
const int INF = 0x3f3f3f3f;
char s[maxn];
int dpQ[maxn];
int dpQA[maxn];
int dpQAQ[maxn];
void show(int a[],int n){
for(int i=0;i<n;i++){
printf("%d ",a[i]);
}printf("\n");
}
int main(){
// freopen("C:\\Users\\lenovo\\Desktop\\data.in","r",stdin);
while(scanf("%s",s)!=EOF){
memset(dpQ,0,sizeof(dpQ));
memset(dpQA,0,sizeof(dpQA));
memset(dpQAQ,0,sizeof(dpQAQ));
int n = strlen(s);
for(int i=0;i<n;i++){
if(s[i]=='A'){
dpQA[i] = dpQA[i-1]+dpQ[i-1];
}else if(s[i]=='Q'){
dpQAQ[i]=dpQAQ[i-1]+dpQA[i-1];
dpQ[i]=dpQ[i-1]+1;
}
if(dpQ[i]==0)dpQ[i]=dpQ[i-1];
if(dpQA[i]==0)dpQA[i]= dpQA[i-1];
if(dpQAQ[i]==0)dpQAQ[i] = dpQAQ[i-1];
}
// show(dpQ,n);
// show(dpQA,n);
// show(dpQAQ,n);
printf("%d\n",dpQAQ[n-1]);
}
}