日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

hdu4405:概率dp

發布時間:2023/12/10 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 hdu4405:概率dp 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題意:

總共有n+1個格子:0-n

初始情況下在 0號格子 每次通過擲骰子確定前進的格子數

此外 還有一些傳送門可以瞬間從 u 點傳送到 v 點(必須被傳送)

求走到(或超過)n點總共需要擲多少次骰子

分析:

太弱 只想到了n^2的 dp方程 可惜n是100000...糾結半天又看了大牛的題解

用 dp[i]記錄 走到第 i 個點時的期望 p[i]記錄第 i 個點的概率。。、

這個概率記錄的感覺比較神奇 ,我先開始想到的n^2是記錄用 i?步 走到 j 點的概率

題解的這個概率應該是??平均后的???f反正就是走到這個點了的概率直接把步數省去了 dp方程就少了一維?

dp[i]=次數 * p 那么 如果對于 i+j 點 dp[i+j]= (次數+1)*p*1/6 = ( dp[i]+p[i] ) / 6;

就可以寫出轉移方程了

同時在維護一個next數組記錄 傳送門 如果next[i]!=i 則證明不可能停在第 i 點 因此就不通過此點進行轉移 直接continue,并把 i 的信息保存在next[i]中

統計答案的時候注意要統計 n到 n+5的和

ac代碼:

#include <iostream> #include <stdio.h> #include<string.h> #include<algorithm> #include<string> #include<ctype.h> using namespace std; #define MAXN 10000 int n,m; int next[100010]; double dp[100010]; double p[100010]; void ini() {memset(dp,0,sizeof(dp));memset(p,0,sizeof(p));for(int i=0;i<=100000;i++){next[i]=i;}int u,v;for(int i=0;i<m;i++){scanf("%d%d",&u,&v);next[u]=v;} } void solve() {dp[0]=0;p[0]=1;for(int i=0;i<n;i++){if(next[i]!=i){p[next[i]]+=p[i];dp[next[i]]+=dp[i];p[i]=0;continue;}for(int j=1;j<=6;j++){p[i+j]+=p[i]*1.0/6.0;dp[i+j]+=(dp[i]+p[i])*1.0/6.0;}}double ans=0;for(int i=n;i<n+6;i++){ans+=dp[i];}printf("%.4f\n",ans); } int main() {while(scanf("%d%d",&n,&m),m+n){ini();solve();}return 0; }

?

轉載于:https://www.cnblogs.com/oneshot/p/4001058.html

總結

以上是生活随笔為你收集整理的hdu4405:概率dp的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。