首页 > 其他 > 详细

[HNOI2010]CHORUS 合唱队 (洛谷P3205)

时间:2018-06-20 22:11:39      阅读:175      评论:0      收藏:0      [点我收藏+]

合唱队

区间DP

f[l][r][0/1]表示生成目标序列中的区间[l,r],最后一个数是a[l]/a[r] 的方案数

边界:

f[i][i][0]=1

转移:

f[l][r][0]=(a[l]<a[l+1]?f[l+1][r][0]:0)+(a[l]<a[r]?f[l+1][r][1]:0);
f[l][r][1]=(a[r]>a[l]?f[l][r-1][0]:0)+(a[r]>a[r-1]?f[l][r-1][1]:0);

 

#include<iostream>
#include<cstdio>
using namespace std;
#define MAXN 1010
#define MOD 19650827
int n,a[MAXN],f[MAXN][MAXN][2];
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    for(int i=1;i<=n;i++) f[i][i][0]=1;
    for(int len=2;len<=n;len++)
     for(int l=1;l+len-1<=n;l++){
         int r=l+len-1;
         f[l][r][0]=((a[l]<a[l+1]?f[l+1][r][0]:0)+(a[l]<a[r]?f[l+1][r][1]:0))%MOD;
         f[l][r][1]=((a[r]>a[l]?f[l][r-1][0]:0)+(a[r]>a[r-1]?f[l][r-1][1]:0))%MOD;
     }
    printf("%d\n",(f[1][n][0]+f[1][n][1])%MOD);
    return 0;
}

 

[HNOI2010]CHORUS 合唱队 (洛谷P3205)

原文:https://www.cnblogs.com/yjkhhh/p/9206272.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!