首页 > 代码库 > POJ1671 动态规划
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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。