您的位置:首页 > 其它

[HDOJ2512]一卡通大冒险(DP)

2016-04-17 10:49 218 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2512

给一个数n,问1~n这n个数内的划分。设dp(i,j)为i划分为j个集合时有多少个。

初始化条件 dp[0][0] = 1,并且所有的i划分和1划分都为1。

i个数划分为j个集合与j-1个集合无关系,所以dp(i,j-1)对dp(i,j)没有贡献,考虑dp(i-1,j-1)和dp(i-1,j)。

递推式:dp(i,j)=dp(i-1,j-1)+dp(i-1,j)*j

#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>

using namespace std;

//kirai
const int maxn = 2222;
const int mod = 1000;
int dp[maxn][maxn];
int n;

int main() {
// freopen("in", "r", stdin);
int T;
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
memset(dp, 0, sizeof(dp));
dp[0][0] = 1;
for(int i = 1; i <= n; i++) {
dp[i][1] = 1;
dp[i][i] = 1;
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= n; j++) {
dp[i][j] = (dp[i-1][j-1] + dp[i-1][j] * j) % 1000;
}
}
for(int i = 1; i < n; i++) {
dp

= (dp

+ dp
[i]) % mod;
}
printf("%d\n", dp

);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: