HDU 4055 計數dp 排列組合

2021-08-08 15:15:06 字數 1261 閱讀 4623

題意:

​ 有一列數字,當第i數字比前乙個數字大的時候就可以生成乙個字元i,否則就是d,現在給出字串,求出數列有多少種排列方式,注意字串?代表比前乙個數字大小都可以。

思路:

​ 此類題可以從當前第i數字是哪乙個考慮。

​ 定義:dp

[i][

j]表示第i個數字是j的組合數。

那麼當第i個字串是『i』,dp

[i][

j]=s

um(d

p[i−

1][1

]+..

.+dp

[i−1

][j−

1])=

dp[i

][j−

1]+d

p[i−

1][j

−1]

是」d」的時候:dp

[i][

j]=s

um(d

p[i−

1][j

]+dp

[i−1

][j+

1]+.

..+d

p[i−

1][i

])=d

p[i−

1][j

]+dp

[i][

j+1]

​ 這裡需要注意的點是可以優化,為什麼,因為在計算的時候,是遞推性質的,可以利用到前乙個結果,具體看**。

#include 

#include

#include

#include

using

namespace

std;

const

int maxn = 1e3+10;

const

int mod = 1000000007;

typedef

long

long ll;

char s[maxn];

ll dp[maxn][maxn];

int main()

}else

if(s[i-1] == 'd')

}else

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

ll ans = 0;

for(int i = 1;i <= len; i++)

printf("%i64d\n",ans);

}return

0;}

HDU 6143 排列組合 DP

題意 給出m字母,現在要求用m個字母去取名字,firstname 和 lastname 不能同時存在相同字母,問 會有多少種組合數,對於firstname 和 lastname 必須保證長度為n。資料量 0m 2000 題意 最開始最開始用的dp去推出所有的解,複雜度達到了n3 平常對複雜度的不重視...

hdu 5151區間dp 排列組合

這道題主要對給定限制條件的利用,然後利用排列組合的知識進行求解,我們通過列舉最後乙個填滿的點來進行計數,並通過排列組合中的乘法原則簡化計數次數 include include include include define mod 1000000007 define max 107 using nam...

V 排列組合 HDU 1521

有n種物品,並且知道每種物品的數量。要求從中選出m件物品的排列數。例如有兩種物品a,b,並且數量都是1,從中選2件物品,則排列有 ab ba 兩種。input 每組輸入資料有兩行,第一行是二個數n,m 1 m,n 10 表示物品數,第二行有n個數,分別表示這n件物品的數量。output 對應每組資料...