不是题解 违规紫衫
设 bi,j 是必须包含端点的区间[i,j]的上升子序列数量, ci,j 是必须包含端点的区间[i,j]的下降子序列数量, fi,j 是以 i 为左端点, 并且山峰高度必须大于aj的山峦数量. 状态转移方程是 fi,j=∑k=i+2n(∑l=i+1k−1[al>aj]bi,lcl,k(fk+1,l+1)). 答案是 ∑i=1nfi,0
bi,j和ci,j是这么处理的:
for(int i = 1; i <= n; i++) {
for(int j = i; j <= n; j++) {
if(i==j)b[i][j]=1,c[i][j]=1;
else {
if(a[i]>=a[j])b[i][j]=0;
else b[i][j]=1;
if(a[i]<=a[j])c[i][j]=0;
else c[i][j]=1;
for(int k = j-1; k > i; k--) {
if(b[i][j]&&(a[k]<a[j]&&a[i]<a[k]))b[i][j]+=b[i][k];
if(c[i][j]&&(a[k]>a[j]&&a[i]>a[k]))c[i][j]+=c[i][k];
}
}
}
}
按这个方法写样例1和2没问题, 样例3输出13162.
找了好久,还是没看出哪有问题, 求大佬解答, 必关.