区间dp,主要问题还是不知道怎么去存状态,感觉dp应该只要探求一个情况如何变到另一个情况就行了……
0右1左
dp[i][j][1]=dp[i+1][j][0]+dp[i+1][j][1]
dp[i][j][0]=dp[i][j-1][0]+dp[i][j-1][1]
#include<bits/stdc++.h> using namespace std; long long dp[1010][1010][2]={0}; long long a[100010]; long long mod=19650827; 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; for(int len=1;len<n;len++) for(int i=1,j=len+i;i<=n&&j<=n;j++,i++) { if(a[i]<a[j]) dp[i][j][1]=(dp[i][j][1]+dp[i+1][j][0])%mod; if(a[i]<a[i+1]) dp[i][j][1]=(dp[i][j][1]+dp[i+1][j][1])%mod; if(a[j]>a[j-1]) dp[i][j][0]=(dp[i][j][0]+dp[i][j-1][0])%mod; if(a[j]>a[i]) dp[i][j][0]=(dp[i][j][0]+dp[i][j-1][1])%mod; dp[i][j][0]%=mod; dp[i][j][1]%=mod; } printf("%lld",(dp[1][n][0]+dp[1][n][1])%mod); return 0; }