dfs|LightOJ1030-Discovering Gold-dp

【dfs|LightOJ1030-Discovering Gold-dp】题目大意:有n个点,开始在1这个点,每次用筛子前进,每到达一个新的点,就把当前的点的金子收下,如果那个点>n就返回去重新抛,问你最后金子的期望是多少;
题目解析:概率dp,一开始一直想着从前面开始dp,肯定不可以因为时间复杂度太高,应该从后面开始dp,这样就是记忆化搜索了,时间复杂度会大大降低;
AC代码:

#include #include #include #include #include using namespace std; double dp[110]; int a[110],n; double dfs(int pos) { if(dp[pos]!=-1.0) return dp[pos]; int i,cnt=0; double ans=0; for(i=1; i<=6; i++) { if(pos+i<=n) { cnt++; ans+=dfs(pos+i); } } dp[pos]=ans*(1.0/cnt)+a[pos]; return dp[pos]; } int main() { int cas,c,i; scanf("%d",&cas); for(c=1; c<=cas; c++) { scanf("%d",&n); for(i=1; i<=n; i++) { scanf("%d",&a[i]); } for(i=1; i<=n; i++) dp[i]=-1.0; dp[n]=a[n]; printf("Case %d: %.12lf\n",c,dfs(1)); } return 0; }




    推荐阅读