
区间dp。
f[i][j][k]表示区间i到j最后一个放的是i/j(k=0/1)的方案数。
注意f[i][i][0]=1,f[i][i][1]=0,如果都是1,就会算重。
#include <iostream> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> #include <cstdio> #define mod 19650827 using namespace std; int n,a[1005],f[1005][1005][2]; int main() { scanf("%d",&n); for (int i=1;i<=n;i++) scanf("%d",&a[i]),f[i][i][0]=1; for (int k=1;k<=n-1;k++) for (int i=1;i+k<=n;i++) { int j=i+k; if (a[i]<a[i+1]) f[i][j][0]=f[i+1][j][0]; if (a[i]<a[j]) (f[i][j][0]+=f[i+1][j][1])%=mod; if (a[j]>a[j-1]) f[i][j][1]=f[i][j-1][1]; if (a[j]>a[i]) (f[i][j][1]+=f[i][j-1][0])%=mod; } cout<<(f[1][n][0]+f[1][n][1])%mod<<endl; return 0; }
原文地址:http://blog.csdn.net/regina8023/article/details/44806797