钉子和小球-----简单线性dp
作者:互联网
钉子和小球-----简单线性dp
题目链接
最后一行的格子想起来比较麻烦,统一的把格子看成钉子,就比较好解决了
状态表示:
f[i][j]
表示第i
行第j
列落到这个钉子上球的个数
状态转移方程
分两种情况:
1.有钉子存在
f[i+1][j]+=f[i][j]
f[i+1][j+1]+=f[i][j]
2.无钉子存在
f[i+2][j+1]+=4*f[i][j]
这里小球在i+1层直线下落,这里必须要乘以4,因为这是模拟的小球下落过程的每一种情况,每下落一层小球会分裂为2个,第i+1层的两个球分裂为四个都是直线下落的,为了跟上面概率保持一致需要乘以4,不然统计概率值会变小。
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long
const int N = 55;
int f[N][N];
char g[N][N];
signed main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
cin>>g[i][j];
}
}
f[1][1]=1;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=i;j++)
{
if(g[i][j]=='*')
{
f[i+1][j]+=f[i][j];
f[i+1][j+1]+=f[i][j];
}
else if(g[i][j]=='.')
{
f[i+2][j+1]+=4*f[i][j];
}
}
}
int sum=0;
for(int i=1;i<=n+1;i++)sum+=f[n+1][i];
int mod=__gcd(sum,f[n+1][m+1]);
cout<<f[n+1][m+1]/mod<<"/"<<sum/mod;
}
标签:int,钉子,小球,long,-----,下落,include,dp 来源: https://blog.csdn.net/qq_51282224/article/details/121450056