国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

夕拾算法進(jìn)階篇:12)出棧序列統(tǒng)計(動態(tài)規(guī)劃DP)

2019-11-14 11:37:39
字體:
供稿:網(wǎng)友
題目描述棧是常用的一種數(shù)據(jù)結(jié)構(gòu),有n令元素在棧頂端一側(cè)等待進(jìn)棧,棧頂端另一側(cè)是出棧序列。你已經(jīng)知道棧的操作有兩?種:push和pop,前者是將一個元素進(jìn)棧,后者是將棧頂元素彈出。現(xiàn)在要使用這兩種操作,由一個操作序列可以得到一系列的輸出序列。請你編程求出對于給定的n,計算并輸出由操作數(shù)序列1,2,…,n,經(jīng)過一系列操作可能得到的輸出序列總數(shù)。 輸入一個整數(shù)n(1<=n<=15) 輸出一個整數(shù),即可能輸出序列的總數(shù)目。樣例輸入3樣例輸出

5

該題雖然是棧的范疇,但是也可以使用動態(tài)規(guī)劃來做。這個題DP的解法可以借用2點之間路徑的數(shù)目來求解,先看下面的圖片:

之前的題目要求:只能向下或右走,從左上角到右下角公有多少條路徑?

其解法如下:

如果要求A1->D4的路徑數(shù)目,可先求D3->D4和C4->D4的路徑數(shù)目,而求D3的路徑數(shù)目,可以求D2->D3和B3-C3的數(shù)目。這是一個重疊子問題,可以使用DP來解決,很明顯其狀態(tài)轉(zhuǎn)移方程(邊界0~n):

dp[i][j]=dp[i-1][j]+dp[i][j-1]

這里可以把向下類比入棧,向右類比出棧。通常出棧之前必須保證棧內(nèi)有元素,所以出棧次數(shù)<=入棧次數(shù)。因為從起點(左上角) 向右出棧是非法的,所以 整個圖只有下三角是我們考慮的區(qū)域,也可以把上三角的點坐標(biāo)值視為0。

初始化起點A1的值為1,由于B1只有上鄰而沒有左鄰節(jié)點,所有B1的值也為1,事實上第一列的值皆為1,因此求棧的出棧序列的數(shù)目,即求N*N的矩陣對應(yīng)下三角的路徑數(shù)目。(PS:矩陣的N*N得用數(shù)組a[N+1][N+1]保存)

#include<iostream>using namespace std; const int M=17;int dp[M][M];  int main(){	int n,i,j;	cin>>n;	for(i=0;i<=n;i++){   		dp[i][0]=1;//第一列置1     }   	for(i=1;i<=n;i++){   		for(j=1;j<=n;j++){   			if(i>=j){   				dp[i][j]=dp[i-1][j]+dp[i][j-1];			}		}		}	cout<<dp[n][n]<<endl; }

題目來源:http://www.codeup.cn/PRoblem.php?cid=100000608&pid=4


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 资中县| 阿鲁科尔沁旗| 夏津县| 平和县| 康定县| 铁岭市| 巴彦县| 冕宁县| 灵璧县| 临西县| 陆河县| 灌云县| 普定县| 明水县| 峨眉山市| 车险| 朝阳县| 闸北区| 甘德县| 静乐县| 卫辉市| 高密市| 越西县| 建宁县| 屏东市| 姚安县| 广元市| 黄浦区| 周口市| 游戏| 长乐市| 封开县| 比如县| 绿春县| 股票| 郑州市| 孟村| 驻马店市| 正蓝旗| 岑溪市| 台南市|