其他分享
首页 > 其他分享> > 钉子和小球-----简单线性dp

钉子和小球-----简单线性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