POJ1671 动态规划

POJ1671

问题重述:

本题求解一首N行诗可能的押韵结构的数目。所谓押韵结构,指的是指定的行数之间必须押韵。例如一首3行诗的押韵结构可以是aaa, aab, aba, baa, abc 5种(aaa表示三行都押韵,aab则表示一二行押韵,abc则表示三行都不押韵)。

分析:

本题可采用动态规划求解。令dp[i][j]表示i行诗拥有j个押韵行集的押韵结构数目(押韵行集:例如aab就是拥有2个押韵行集)。则有递归公式:dp[i][j] = dp[i - 1][j - 1] + j * dp[i - 1][j]

1)  假如第i行与上面i – 1行都不押韵,则第i行只有一种选择,共有dp[i - 1][j - 1]种结构

2)  假如第i行属于上面i – 1行中的某个押韵行集,则有j种选择,共有j * dp[i - 1][j]种结构

AC代码:

 1 //Memory: 224K        Time: 0MS

 2 #include <iostream>

 3 #include <cstring>

 4 #include <cstdio>

 5 

 6 using namespace std;

 7 

 8 const int maxn = 100;

 9 double dp[maxn][maxn];

10 int n;

11 

12 void dynamic()

13 {

14     memset(dp, 0, sizeof(dp));

15     dp[1][1] = 1;

16     for (int i = 2; i <= maxn; i++) {

17         for (int j = i; j >= 1; j--) {

18             dp[i][j] = dp[i - 1][j - 1] + j * dp[i - 1][j];

19         }

20     }

21 }

22 

23 int main()

24 {

25     dynamic();

26     while (scanf("%d", &n) && n) {

27         double ans = 0;

28         for (int i = 1; i <= n; i++) {

29             ans += dp[n][i];

30         }

31         printf("%d %.0llf\n", n, ans);

32     }

33     return 0;

34 }

你可能感兴趣的:(动态规划)