BZOJ 1996: [Hnoi2010]chorus 合唱队 区间dp

来源:互联网 发布:mihoyo米哈游淘宝店铺 编辑:程序博客网 时间:2024/06/05 20:05

1996: [Hnoi2010]chorus 合唱队

Time Limit: 4 Sec  Memory Limit: 64 MB
Submit: 1736  Solved: 1121
[Submit][Status][Discuss]

Description

Input

Output

Sample Input

4
1701 1702 1703 1704

Sample Output

8

HINT

 


区间dp

f[i][j][2]

表示区间[i,j]最后进来的是i还是j


#include<cmath>#include<ctime>#include<cstdio>#include<cstring>#include<cstdlib>#include<complex>#include<iostream>#include<algorithm>#include<iomanip>#include<vector>#include<string>#include<bitset>#include<queue>#include<map>#include<set>using namespace std;inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}void print(int x){if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');}const int N=1010,mod=19650827;int f[N][N][2],a[N];int main(){register int i,l;int n=read();for(i=1;i<=n;++i)a[i]=read();for(i=1;i<=n;++i)f[i][i][0]=1;for(l=1;l<n;++l)for(i=1;i+l<=n;++i){if(a[i]<a[i+l])f[i][i+l][0]+=f[i+1][i+l][1];if(a[i]<a[i+1])f[i][i+l][0]+=f[i+1][i+l][0];if(a[i+l]>a[i+l-1])f[i][i+l][1]+=f[i][i+l-1][1];if(a[i+l]>a[i])f[i][i+l][1]+=f[i][i+l-1][0];f[i][i+l][0]%=mod;f[i][i+l][1]%=mod;}print((f[1][n][0]+f[1][n][1])%mod);puts("");return 0;}/*41701 1702 1703 17048*/