我设dp[i][j]表示考虑到第i个数字,栈内有j个元素的顺序数,依次考虑第1-n个数字。然后对每个数字有两种情况,入栈后要么留在栈顶,要么弹出去形成顺序,遂写出以下转移```
for(int i=2;i<=n;i++)
for(int j=0;j<i;j++)
for(int s=j;s>=0;s--)
{
dp[i][s]+=dp[i-1][j];
dp[i][s+1]+=dp[i-1][j];
}
然后发现重复了,加上如下
for(int i=2;i<=n;i++)
for(int j=0;j<i;j++)
for(int s=j;s>=0;s--)
{
if(s==0)dp[i][s]+=dp[i-1][j];
dp[i][s+1]+=dp[i-1][j];
}
才过,意思是当栈内非空时只能入栈,不然就重复了,有没有大佬来告诉一下我这个蒟蒻是为啥啊QAQ