题意:10*10的方格,每掷一次骰子向前走相应的步数,给n组数,x,y 表示从x可以到直接传送到y。
可以直接简化为1*100的模型,网上的一些递推公式看不太懂。每次掷骰子的时候跟前几个题是一样的,dp[i] = dp[i+1]/6 + dp[i+2]/6 + … +d[i+6]/6 +1 ; 不过要注意下边界。化简一下就可以得到 6*dp[i] - dp[i+1] - … -dp[i+6] = 6 ;
对于可以传送的点 : dp[i] = dp[next[i]] ; 化简得到 dp[i] -next[dp[i]] = 0;
然后就是高斯消元的内容了:
高斯消元传送门:https://www.cnblogs.com/Robert-Yuan/p/4621481.html 这个dalao讲的还是挺好的。
用上面两个化简之后的式子可以写出线性方程组的增广矩阵,套用一下高斯消元的板子就可以了。
本题增广矩阵的写法:
for(int i=1; i<100; i++)
{
if(nxt[i])
{
a[i][101]=0;
a[i][i]=1;
a[i][nxt[i]]=-1;
}
else
{
int cnt=0;
for(int j=1; i+j<=100&&j<=6; j++)
{
cnt++;
a[i][i+j]=-1;
}
a[i][i]=cnt;
a[i][101]=6;
}
}
a[100][100]=1;
a[100][101]=0;