P3205 [HNOI2010]合唱队

题目:

https://www.luogu.com.cn/problem/P3205

dp[i][j][0]表示第i个数从左边进

dp[i][j][1]表示第j个数从右边进

 

P3205 [HNOI2010]合唱队

 

 注意处理边界属于等价的情况,只用算一遍

#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<queue>
using namespace std;
typedef pair<int ,int > p;
typedef long long ll;
const int mod=19650827;
int a[1003];
int dp[1003][1003][2];
//dp[i][j][0]表示第i个人从左边
//dp[i][j][1]表示第j个人从右边
int main()
{
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
   scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
        dp[i][i][0]=1;//i==j的时候只有一个数,等价于从左边进或者从右边进
        int ans=0;
   for(int len=1;len<=n;len++)
   {
       for(int i=1,j=i+len-1;j<=n;i++,j++)
       {
           if(a[i]<a[i+1])
            dp[i][j][0]+=dp[i+1][j][0];
            
           if(a[i]<a[j])
            dp[i][j][0]+=dp[i+1][j][1];
           if(a[j]>a[j-1])
            dp[i][j][1]+=dp[i][j-1][1];
           if(a[j]>a[i])
            dp[i][j][1]+=dp[i][j-1][0];
            
            
                        dp[i][j][0]%=mod;
                        dp[i][j][1]%=mod;
       }
   }
   printf("%d\n",(dp[1][n][0]+dp[1][n][1])%mod);
}

 

上一篇:1003 我要通过


下一篇:1003 我要通过!(20 分)