洛谷 p1044 dp 棧

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
    int i, j;
    int n;
    cin >> n;
    long long c[20][20];//c[i][j]即出棧i個,進棧j個

    for (j = 0; j <= n; j++)
        c[0][j] = 1;
    for (i = 1; i <= n; i++)
        for (j = i; j <= n; j++)
        {
            if (i == j) c[i][j] = c[i - 1][j];
            else c[i][j] = c[i - 1][j] + c[i][j - 1];
        }
    printf("%d\n", c[n][n]);
    return 0;
}


/*
分析:運用dp的思想
①:狀態:c[i][j]表示有i個出棧的,有j個進棧的  
②:再找出狀態邊界,轉移公式。
        當出棧的個數爲0時,只有唯一的結果,就是逐個出棧形成的序列
        當出棧等於進棧個數的時候,就是棧爲空,它的子狀態必然是唯一一種,棧裏只有一個數,而出棧了i-1個
        當出棧不等於進棧時,子狀態有兩種,其一爲進棧少一個,出棧不變,另一個則是進棧不少,但出棧少一個

*/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章