題意:
有一列數字,當第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 對應每組資料...