題目:有一個集合{0,1,..,k},問其中元素組成的長為n的串中,相鄰元素差值不超過2的串的數比例。
分析:動態規劃、概率dp。
初始狀態:f(i,1)= 1 /(k+1);
狀態轉移:f(i,j)= sum(f(i-1,t))/ (k+1) { 其中,t為和j相差不超過2的元素 }。
說明:好久沒刷題了╮(╯▽╰)╭。
#include <algorithm> #include <iostream> #include <cstdlib> #include <cstring> #include <cstdio> #include <cmath> using namespace std; double dp[101][10]; int main() { int k, n; while (cin >> k >> n) { for (int i = 0; i <= k; ++ i) dp[1][i] = 1.0/(k+1); for (int i = 2; i <= n; ++ i) for (int j = 0; j <= k; ++ j) { dp[i][j] = 0.0; for (int t = 0; t <= k; ++ t) { if (abs(t-j) > 1) continue; dp[i][j] += dp[i-1][t]/(k+1); } } double sum = 0.0; for (int i = 0; i <= k; ++ i) sum += dp[n][i]; printf("%.5lf\n",100.0*sum); } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-10 13:03:58