标签:Hyakugoku 终点 597 10 int rep Codeforces id dp
题目链接:https://codeforces.com/contest/1245/problem/E
题目大意:
一个10*10矩阵,左下角起点,左上角终点,按照S型前进,每次通过扔骰子确定行走步数,1~6概率相同,到最后只剩1~6的时候只能正好扔到所需点数才能到达。同时如果遇到梯子的话可以沿着梯子爬上去,问到达终点的期望步数。
题目思路:
设1为终点,100为起点,id[x][y]表示(x,y)坐标的编号。a[x]表示x编号可以靠它那个位置的梯子到达哪个位置。
这题相较于普通的概率DP有两点不同,一个是最后六步必须正好到,一个是可以坐梯子。首先可以发现,在终点肯定不用动就在终点,所以dp[1]=0,终点的期望是确定的,所以需要从终点向起点倒推。同时最后六步需要计算。这六步到达终点的期望步数,要么是61的概率直接到终点,要么是65概率原地踏步,所以得到公式:
f(x)=65∗(f(x)+1)+61∗(f(1)+1)
由于f(1)=0,代入整理得到:
f(x)=6
所以最后六步期望就是固定的6。然后就是dp转移,枚举1~6作为走的步数,设为j,假设他当前在第i个点,那么他可能是i-j来的,当然也可能是i-j能爬上去的那个梯子的位置过来的(这里要注意,咱是倒推!)所以取个min继续推导即可。
以下是代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
const int MAXN=1e2+5;
const int MOD=1e9+7;
int id[MAXN][MAXN],a[MAXN];
double dp[MAXN];
int main()
{
rep(i,1,10){
rep(j,1,10){
if(i&1)id[i][j]=(i-1)*10+j;
else id[i][j]=i*10-j+1;
}
}
rep(i,1,10){
rep(j,1,10){
int x;
cin>>x;
a[id[i][j]]=id[i-x][j];
}
}
dp[1]=0;
rep(i,2,7)dp[i]=6;
rep(i,8,100){
dp[i]=0;
rep(j,1,6){
dp[i]+=min(dp[i-j],dp[a[i-j]])+1;
}
dp[i]=dp[i]/6.0;
}
cout<<fixed<<setprecision(10)<<dp[100]<<endl;
return 0;
}
smilestruggler
发布了274 篇原创文章 · 获赞 27 · 访问量 2万+
私信
关注
标签:Hyakugoku,终点,597,10,int,rep,Codeforces,id,dp 来源: https://blog.csdn.net/toohandsomeIeaseId/article/details/104170819
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。