题解:一道经典的区间
dp
d
p
。
设
dp[i][j][0/1]
d
p
[
i
]
[
j
]
[
0
/
1
]
表示区间
i
i
到最后取左/右端点的方案总数。
状态转移就简单了,直接判断边界条件进行转移即可。
Code:
C
o
d
e
:
#include<bits/stdc++.h>
#define mod 19650827
#define N 1005
using namespace std;
int n,dp[N][N][2],a[N];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
dp[i][i][1]=1;
for(int i=n-1;i>=1;i--)
for(int j=i+1;j<=n;j++)
{
if(a[i]<a[i+1])dp[i][j][0]+=dp[i+1][j][0]%mod;
if(a[i]<a[j])dp[i][j][0]+=dp[i+1][j][1]%mod;
if(a[j]>a[j-1])dp[i][j][1]+=dp[i][j-1][1]%mod;
if(a[j]>a[i])dp[i][j][1]+=dp[i][j-1][0]%mod;
}
printf("%d\n",(dp[1][n][0]+dp[1][n][1])%mod);
}