HDU 5001 概率DP || 记忆化搜索
生活随笔
收集整理的這篇文章主要介紹了
HDU 5001 概率DP || 记忆化搜索
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2014 ACM/ICPC Asia Regional Anshan Online
給N個點,M條邊組成的圖,每一步能夠從一個點走到相鄰任一點,概率同樣,問D步后沒走到過每一個點的概率
概率DP ?測試數據太水了。。。。10000*50*50*50都能過
加個vector優化到
記憶化搜索: 每次去掉一個點,然后對剩下的點進行記憶化搜索
#include "stdio.h" #include "string.h" #include "vector" using namespace std;int vis[101][10011],cnt[101]; double dp[101][10011]; int d; vector<int>map[101]; double dfs(int a,int b,int c) //當前在a點,已經走了b步,不經過c點 {int i;double ans;if (vis[a][b]) return dp[a][b];vis[a][b]=1;ans=0;if (b>d) return dp[a][b]=1;for (i=0;i<map[a].size();i++)if (map[a][i]!=c)ans+=1.0/cnt[a]*dfs(map[a][i],b+1,c);return dp[a][b]=ans;}int main() {int Case,n,m,i,a,b;scanf("%d",&Case);while (Case--){scanf("%d%d%d",&n,&m,&d);memset(cnt,0,sizeof(cnt));for (i=0;i<=n;i++)map[i].clear();while (m--){scanf("%d%d",&a,&b);cnt[a]++;cnt[b]++;map[a].push_back(b);map[b].push_back(a);}memset(dp,0,sizeof(dp));for (i=1;i<=n;i++)map[0].push_back(i);cnt[0]=n;for (i=1;i<=n;i++){memset(vis,0,sizeof(vis));printf("%.10lf\n",dfs(0,0,i));}}return 0; }轉載于:https://www.cnblogs.com/mfrbuaa/p/4294540.html
總結
以上是生活随笔為你收集整理的HDU 5001 概率DP || 记忆化搜索的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: win8下notepad++无法设置文件
- 下一篇: 初创互联网公司简明创业指南 - YC新掌