国产探花免费观看_亚洲丰满少妇自慰呻吟_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ā)表
主站蜘蛛池模板: 牡丹江市| 太仓市| 德化县| 麻城市| 邛崃市| 潞西市| 和顺县| 清镇市| 紫云| 麦盖提县| 崇州市| 三明市| 丰镇市| 沽源县| 江津市| 枝江市| 西峡县| 土默特左旗| 天水市| 白朗县| 苍山县| 金平| 卢湾区| 全南县| 合山市| 邵东县| 西林县| 水城县| 蚌埠市| 桃源县| 滁州市| 专栏| 浦北县| 景谷| 柳河县| 新邵县| 桑植县| 昌邑市| 乐平市| 陵川县| 抚顺县|