poj1037 dp 排列計數

2021-07-23 06:44:36 字數 1041 閱讀 8403

今天學習dp  看的是北大培訓的課件 看到了這道題  開始看的時候  就算知道是dp 也不知道怎麼去寫  後面看了ac**

直接寫思路  c[i][k][down]表示的是前i根木頭中 以k打頭陣的down總數

//c[i][k][up]表示的是 前i根木頭中 以k打頭陣的up總數

再寫這道題時  首先要知道怎麼去排列計數  直接列課件內容

如1,2,3,4的全排列,共有4!種,求第10個的排列是?

先試首位是1,後234有3!=6種<10,說明1偏小,轉化成以2開頭的第(10-6=4)個排列,而3!=6 >= 4,說明首位恰是2。

第二位先試1(1沒用過),後面2!=2個<4,1偏小,換成3(2用過了)為第二位,總編號也再減去2!,剩下2了。而此時2!>=2,說明第二位恰好是3。

第三位先試1,但後面1!<2,因此改用4。末位則是1了。

這樣得出,第10個排列是2-3-4-1。(從1計起)

這種方法的核心在於求,給定字首下後面總的排列數。全排列問題較易求。同時還需記錄前面用過的數字

直接看**吧  **有我自己的理解 

後面的要歸納出怎麼解dp的題  未完 

#include#include#include#includeusing namespace std;

const int up=0,down=1;

const int maxn=25;

long long c[maxn][maxn][2];//c[i][k][down]表示的是前i根木頭中 以k打頭陣的down總數

//c[i][k][up]表示的是 前i根木頭中 以k打頭陣的up總數

void init(int n)

} used[k]=1;

ans[i]=k;

} for(int i=1;i<=n;i++)

printf("%d ",ans[i]);

printf("\n");

}int main()

return 0;

}

怎麼解dp  怎麼知道這是dp題

排列計數(dp)

主要題意就是給你乙個排列組合,要輸出指定ai i的個數輸出符合的排列組合與1000000007取模個數。input there are several test cases,and one line for each case,which contains two integers,n and k....

Perm排列計數

記憶體限制 512 mib 時間限制 1000 ms 標準輸入輸出 題目描述 稱乙個1,2,n的排列p1,p2.pn是magic的,當且僅當2 i n時,pi pi 2.計算1,2,n的排列中有多少是magic的,答案可能很大,只能輸出模p以後的值 輸入格式 輸入檔案的第一行包含兩個整數 n和p,含...

Perm 排列計數

題目描述 稱乙個1,2,n的排列p1,p2.pn是magic的,當且僅當2 i n時,pi pi 2.計算1,2,n的排列中有多少是magic的,答案可能很大,只能輸出模p以後的值 輸入格式 輸入檔案的第一行包含兩個整數 n和p,含義如上所述。輸出格式 輸出檔案中僅包含乙個整數,表示計算1,2的排列...