码迷,mamicode.com
首页 > 其他好文 > 详细

POJ1671 动态规划

时间:2014-07-24 21:51:12      阅读:196      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   os   io   for   re   

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 }

POJ1671 动态规划,布布扣,bubuko.com

POJ1671 动态规划

标签:style   blog   http   color   os   io   for   re   

原文地址:http://www.cnblogs.com/junxie/p/3866002.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!