题目链接:T 秒后青蛙的位置
bitset保存遍历状态
unordered_map保存dp值
#include<bits/stdc++.h> #define pb push_back using namespace std; const int N=1e2+5; class Solution { public: struct hash_name{ size_t operator()(const pair<bitset<N>,int> & p) const{ return (hash<bitset<N>>()(p.first)*100) + hash<int>()(p.second); } }; unordered_map<pair<bitset<N>,int>,double,hash_name>dp[2]; vector<int>g[N]; void init(vector<vector<int>>& edges) { for(auto e:edges) { g[e[0]].pb(e[1]); g[e[1]].pb(e[0]); } } vector<int> get_to(bitset<N> st,int v) { vector<int>ans; for(auto x:g[v]) { if(!st[x]) { ans.pb(x); } } return ans; } void add(int id,pair<bitset<N>,int> sta,double p) { if(dp[id].count(sta)) { dp[id][sta]+=p; } else { dp[id][sta]=p; } } double frogPosition(int n, vector<vector<int>>& edges, int t, int target) { init(edges); int tmp=0; pair<bitset<N>,int>state; state.first[1]=1; state.second=1; dp[0][state]=1; for(int i=0;i<t;i++) { dp[tmp^1].clear(); for(auto it:dp[tmp]) { pair<bitset<N>,int>sta=it.first; //cout<<sta.first<<" "<<sta.second<<endl; vector<int> to=get_to(sta.first,sta.second); if(to.size()==0) { add(tmp^1,sta,it.second); } else { for(auto x:to) { pair<bitset<N>,int>tt=sta; tt.first[x]=1; tt.second=x; //cout<<x<<" "<<endl; add(tmp^1,tt,it.second/to.size()); } } } tmp^=1; } double ans=0; for(auto it:dp[tmp]) { pair<bitset<N>,int>sta=it.first; if(sta.second==target) { ans+=it.second; } } return ans; } };