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

首頁 > 學院 > 開發設計 > 正文

夕拾算法進階篇:12)出棧序列統計(動態規劃DP)

2019-11-14 12:32:40
字體:
來源:轉載
供稿:網友
題目描述棧是常用的一種數據結構,有n令元素在棧頂端一側等待進棧,棧頂端另一側是出棧序列。你已經知道棧的操作有兩?種:push和pop,前者是將一個元素進棧,后者是將棧頂元素彈出。現在要使用這兩種操作,由一個操作序列可以得到一系列的輸出序列。請你編程求出對于給定的n,計算并輸出由操作數序列1,2,…,n,經過一系列操作可能得到的輸出序列總數。 輸入一個整數n(1<=n<=15) 輸出一個整數,即可能輸出序列的總數目。樣例輸入3樣例輸出

5

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

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

其解法如下:

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

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

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

初始化起點A1的值為1,由于B1只有上鄰而沒有左鄰節點,所有B1的值也為1,事實上第一列的值皆為1,因此求棧的出棧序列的數目,即求N*N的矩陣對應下三角的路徑數目。(PS:矩陣的N*N得用數組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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 安福县| 宾川县| 江北区| 汕头市| 托里县| 上饶县| 西乌| 榆社县| 黄山市| 永丰县| 霍山县| 平定县| 时尚| 田林县| 东海县| 丰原市| 云安县| 托克托县| 沿河| 黄冈市| 聂荣县| 广昌县| 双牌县| 清水县| 定襄县| 抚州市| 泗阳县| 出国| 朝阳区| 喀喇| 洛浦县| 澄城县| 中宁县| 金塔县| 常宁市| 龙江县| 陆良县| 辽宁省| 竹北市| 会昌县| 贵港市|