您的位置:首页 > 其它

判断可能出栈顺序--动态规划解法

2013-05-20 14:36 274 查看
先给定一个进栈序列(如1,2,3,4,5),可以随意弹栈(如在3进栈之前,2就可能已经进栈然后出栈了)

然后给定一个序列如5,4,3,2,1和3,4,5,1,2,判断是不是其弹栈序列。

我是用动态规划强行弄出来的,弄出来后查质料得知这是一个卡特兰数问题。。。。

思路:

例子4,3,5,1,2

一旦一个数弹栈了比如上面序列中的4,在它进栈之前又在它后面出栈的元素,如1,2,3在它之前进栈,同时又在它后面出栈的序列(3,1,2)

如果这个序列不是和他们进栈的顺序相反的,那么就不是栈的可能出栈顺序。

实现如下

bool Check(int *index,int *ipt,int length)
{
bool inverse=false;  //记录是否有逆序数
int max=index[ipt[length-1]]; //max记录已经扫描的序列中最大元素
int min=max;		      //min记录已经出现的元素中按降序出现的最大元素
int lastinv=min;	     //如4,5,3,2 max=5,min=4
for(int i=length-2;i>0;i--)
{
if(index[ipt[i]]>max)
{
if(max!=index[ipt[i+1]])  //特殊情况,出现新的最大数,那么最大不是在之前的话则不是
return false;
else
max=index[ipt[i]];
}

else if(index[ipt[i]]>min&&index[ipt[i]]<max)
{
if(inverse&&index[ipt[i]]>lastinv)   //如果有逆序数,且比最小的逆序数大
return false;
min=index[ipt[i]];
continue;
}
else if(index[ipt[i]]<min)
{
if(inverse&&index[ipt[i]]>lastinv)   //如果有逆序数,且比最小的逆序数大
return false;
if(!inverse)			//记录是否有逆序数
inverse=true;
lastinv=min;			//始终记录最小的逆序数
min=index[ipt[i]];

}
else if(inverse)
if(index[ipt[i]]>lastinv&&index[ipt[i]]<max)
return false;

}
return true;
}


运行结果:

   
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划
相关文章推荐