bzoj1996: [Hnoi2010]chorus 合唱队
2017-09-05 09:10
507 查看
区间dp。
f[i][j][1/0]表示[i,j]区间上一个选左或右。
f[i][j][0]=f[i+1][j][0]∗(a[i]<a[i+1])+f[i+1][j][1]∗(a[i]<a[j])
f[i][j][1]=f[i][j−1][0]∗(a[j]>a[i])+f[i][j−1][1]∗(a[j]>a[j−1])
f[i][j][1/0]表示[i,j]区间上一个选左或右。
f[i][j][0]=f[i+1][j][0]∗(a[i]<a[i+1])+f[i+1][j][1]∗(a[i]<a[j])
f[i][j][1]=f[i][j−1][0]∗(a[j]>a[i])+f[i][j−1][1]∗(a[j]>a[j−1])
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int mod=19650827; int read() { char ch=getchar();int f=0; while(ch<'0'||ch>'9')ch=getchar(); while(ch>='0'&&ch<='9'){f=(f<<1)+(f<<3)+ch-'0';ch=getchar();} return f; } int f[1005][1005][2],n,a[1005]; int main() { n=read(); for(int i=1;i<=n;i++) { a[i]=read(); f[i][i][0]=1; } for(int i=n;i;i--) { for(int j=i+1;j<=n;j++) { f[i][j][0]=f[i+1][j][0]*(a[i]<a[i+1])+f[i+1][j][1]*(a[i]<a[j]); f[i][j][1]=f[i][j-1][0]*(a[j]>a[i])+f[i][j-1][1]*(a[j]>a[j-1]); f[i][j][0]%=mod,f[i][j][1]%=mod; } } cout<<(f[1] [1]+f[1] [0])%mod; }
相关文章推荐
- bzoj1996 [Hnoi2010]chorus 合唱队
- bzoj 1996: [Hnoi2010]chorus 合唱队 dp
- BZOJ 1996: [Hnoi2010]chorus 合唱队
- BZOJ 1996 HNOI 2010 chorus 合唱队 区间DP
- BZOJ 1996: [Hnoi2010]chorus 合唱队 区间dp
- 【bzoj1996】[Hnoi2010]chorus 合唱队 区间dp
- bzoj 1996 [Hnoi2010]chorus 合唱队
- BZOJ1996 [Hnoi2010]chorus 合唱队
- bzoj 1996: [Hnoi2010]chorus 合唱队
- bzoj 1996: [Hnoi2010]chorus 合唱队
- [BZOJ1996][Hnoi2010]chorus 合唱队
- 【BZOJ1996】[Hnoi2010]chorus 合唱队 区间DP
- bzoj1996【HNOI2010】chorus 合唱队
- 1996: [Hnoi2010]chorus 合唱队 - BZOJ
- bzoj 1996: [Hnoi2010]chorus 合唱队
- 【BZOJ1996】[Hnoi2010]chorus 合唱队【区间DP】
- [BZOJ1996][Hnoi2010]chorus 合唱队 区间dp
- bzoj1996 [Hnoi2010]chorus 合唱队
- 【BZOJ1996】【Hnoi2010】chorus 合唱队 动态规划
- 【BZOJ 1996】 [Hnoi2010]chorus 合唱队