[Hnoi2010]chorus 合唱队

[Hnoi2010]chorus 合唱队

Time Limit:4000MS  Memory Limit:65536K
Total Submit:97 Accepted:59
Case Time Limit:1000MS

Description

Input

Output

Sample Input

4
1701 1702 1703 1704

Sample Output

8

Hint

Source
额。。这个题目显然可以直接Dp。。状态就是当前队列(只肯是一个连续子序列)和最后一个是左边还是右边。。
然后就可以无压力AC了囧。。
Code:

#include <vector>
#include <algorithm>
#include <utility>
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <set>
#include <map>
#include <cstring>
#include <time.h>
#define rep(i,n) for(int i=0;i<n;i++)
#define pb push_back
#define Debug(x) cout<<#x<<"="<<x<<endl;
#define For(i,l,r) for(int i=l;i<=r;i++)
#define tr(e,x) for(typeof(x.begin()) e=x.begin();e!=x.end();e++)
#define printTime cout<<"Time:"<<pre-clock()<<endl;pre=clock();
const int inf=~0U>>1,maxn=1000,mod=19650827;
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
int Dp[maxn][maxn][2]={};
int A[maxn],n;
inline void Update(int&x,int c)
{
x+=c;if(x>=mod)x-=mod;
}
int main()
{
//freopen("in","r",stdin);
cin>>n;rep(i,n)scanf("%d",A+i),Dp[i][i][0]=1;
for(int s=1;s<n;s++)
for(int l=0;l+s<=n;l++)
{
int r=s+l;
{
int&ret=Dp[l][r][0];
if(A[l]<A[l+1])Update(ret,Dp[l+1][r][0]);
if(A[l]<A[r])Update(ret,Dp[l+1][r][1]);
}
{
int&ret=Dp[l][r][1];
if(A[r]>A[r-1])Update(ret,Dp[l][r-1][1]);
if(A[r]>A[l])Update(ret,Dp[l][r-1][0]);
}
}
int ans=0;Update(ans,Dp[0][n-1][0]);
Update(ans,Dp[0][n-1][1]);
printf("%dn",ans);
}

Leave a Reply

Your email address will not be published. Required fields are marked *