洛谷 P3205 [HNOI2010]合唱队

题目传送门

解题思路:

f[i][j][0]表示i~j区间最后一个进来的元素是i.

f[i][j][1]表示i~j区间最后一个进来的元素是j.

AC代码:

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 
 5 using namespace std;
 6 
 7 int n,a[1001],f[1001][1011][2];
 8 
 9 int main() {
10     scanf("%d",&n);
11     for(int i = 1;i <= n; i++)
12         scanf("%d",&a[i]);
13     for(int i = 1;i <= n; i++)
14         f[i][i][0] = 1;//只有一个元素时,默认从左边进来的 
15     for(int len = 1;len < n; len++) 
16         for(int i = 1,j = len + i;j <= n; i++,j++) {
17             if(a[i] < a[j]) f[i][j][0] += f[i+1][j][1];
18             if(a[i] < a[i+1]) f[i][j][0] += f[i+1][j][0];
19             if(a[j] > a[i]) f[i][j][1] += f[i][j-1][0];
20             if(a[j] > a[j-1]) f[i][j][1] += f[i][j-1][1];
21             f[i][j][1] %= 19650827;
22             f[i][j][0] %= 19650827;
23         }
24     printf("%d",(f[1][n][1] + f[1][n][0]) % 19650827);
25     return 0;
26 } 

 

posted @ 2020-01-31 22:47  Mr^Simon  阅读(91)  评论(3编辑  收藏  举报