HDU 2512 一卡通大冒险

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2512

 1 //dp[i][j] 表示i个卡片分成j组 由两种状态转移过来
 2 //一:第i个卡片单独分成一组,那有dp[i-1][j-1]种
 3 //二:第i张牌与其他组任意一组夹在一块,i-1张牌就得分成j组,那就是dp[i-1][j]种乘上个j,即dp[i-1][j]*j种
 4 //处理边界情况:多个牌分成一组的话 dp[i][1] = 1,多个牌分成同样多组的话 dp[i][i] = 1
 5 #include <iostream>
 6 #include <cstdio>
 7 #include <cstring>
 8 using namespace std;
 9 int dp[2005][2005];
10 int main()
11 {
12     for(int i = 1 ; i <= 2000 ; ++i) {
13         for(int j = 1 ; j <= i ; ++j) {
14             if(i == j || j == 1)
15                 dp[i][j] = 1;
16             else
17                 dp[i][j] = (dp[i - 1][j - 1] + dp[i - 1][j] * j) % 1000;
18         }
19     }
20     int t , n;
21     scanf("%d" , &t);
22     for(int ca = 1 ; ca <= t ; ++ca) {
23         scanf("%d" , &n);
24         int res = 0;
25         for(int i = 1 ; i <= n ; ++i)
26             res = (res + dp[n][i]) % 1000;
27         printf("%d
" , res);
28     }
29 }
原文地址:https://www.cnblogs.com/Recoder/p/5521381.html