您的位置:首页 > 产品设计 > UI/UE

山东省第四届ACM大学生程序设计竞赛 Mountain Subsequences dp

2016-04-11 20:49 597 查看

Mountain Subsequences

Time Limit: 1000MS Memory limit: 65536K

题目描述

Coco is a beautiful ACMer girl living in a very beautiful mountain. There are many trees and flowers on the mountain, and there are many animals and birds also. Coco like the mountain so much that she now name some letter sequences
as Mountain Subsequences.
 
A Mountain Subsequence is defined as following:
1. If the length of the subsequence is n, there should be a max value letter, and the subsequence should like this, a1 < ...< ai < ai+1 < Amax > aj > aj+1 > ... > an
2. It should have at least 3 elements, and in the left of the max value letter there should have at least one element, the same as in the right.
3. The value of the letter is the ASCII value.
 
Given a letter sequence, Coco wants to know how many Mountain Subsequences exist.

输入

Input contains multiple test cases.
For each case there is a number n (1<= n <= 100000) which means the length of the letter sequence in the first line, and the next line contains the letter sequence.
Please note that the letter sequence only contain lowercase letters. 

输出

For each case please output the number of the mountain subsequences module 2012.

示例输入

4abca


示例输出

4


提示

The 4 mountain subsequences are:
aba, aca, bca, abca

来源

 2013年山东省第四届ACM大学生程序设计竞赛

示例程序

求凸子序列的个数

先求一遍每个点到当前的递增子序列个数

在求一遍每个点为起点到结束的递减子序列的个数

最后相乘就是答案

ACcode:

#include <map>
#include <queue>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
#define maxn 100100
#define mod 2012
using namespace std;
int low[maxn],big[maxn],a[maxn],num[maxn];
char mapp[maxn];
void init(){
memset(low,0,sizeof(low));
memset(big,0,sizeof(big));
memset(num,0,sizeof(num));
}
int main(){
int n,ans;
while(~scanf("%d",&n)){
init();
scanf("%s",&mapp);
for(int i=0;i<n;++i)a[i]=mapp[i]-'a';
for(int i=0;i<n;++i){
for(int j=0;j<a[i];++j)
low[i]=(low[i]+num[j])%mod;
num[a[i]]=(num[a[i]]+low[i]+1)%mod;
}
/*for(int i=0;i<n;++i)cout<<num[i]<<' ';
cout<<'\12';*/
memset(num,0,sizeof(num));
for(int i=n-1;i>=0;--i){
for(int j=0;j<a[i];++j)
big[i]=(big[i]+num[j])%mod;
num[a[i]]=(num[a[i]]+big[i]+1)%mod;
}
/* for(int i=0;i<n;++i)cout<<num[i]<<' ';
cout<<'\12';
for(int i=0;i<n;++i)cout<<low[i]<<" ";
cout<<'\12';
for(int i=0;i<n;++i)cout<<big[i]<<' ';
cout<<'\12';*/
ans=0;
for(int i=0;i<n;++i)ans=(ans+big[i]*low[i])%mod;
printf("%d\n",ans);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: