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

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

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

2019-11-14 11:38:31
字體:
來源:轉載
供稿:網友
題目描述棧是常用的一種數據結構,有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


上一篇:C結構體

下一篇:jxl解析excel表格代碼

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 江华| 华池县| 北辰区| 城口县| 河东区| 土默特右旗| 囊谦县| 理塘县| 贵德县| 娄底市| 临漳县| 巩义市| 钟祥市| 昭通市| 华池县| 清镇市| 独山县| 亚东县| 鹤峰县| 寻乌县| 上犹县| 杂多县| 沁阳市| 济宁市| 滁州市| 江孜县| 康保县| 樟树市| 星座| 固阳县| 项城市| 清涧县| 河西区| 连山| 达孜县| 武夷山市| 肃宁县| 成武县| 买车| 阿拉善右旗| 上蔡县|