poj 1189 钉子和小球

来源:互联网 发布:苹果电脑 mac地址 编辑:程序博客网 时间:2024/06/11 18:55

  一道比较基础的动态规划,首先记录输入的数据,就是钉子的位置,在用一个同样大小的数组记录概率,由于概率分母是固定的2的n次方,所以只用记录分子,遇到钉子,就把值原样传给下面两个,没有钉子就直接掉两层,概率不变,所以掉两层要乘4。最后约分并输出。值得注意的是他的输入,样例给的乱七八糟,所以就要判断输入字符的合法性。

50组数据,2的50次方,长整型装的下。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int main(){    __int64 i,j,n,m;    char c[55][55];    __int64 dp[55][55];    scanf("%I64d%I64d",&n,&m);    for(i=1; i<=n; i++)    {        for(j=1; j<=i; j++)            while(scanf("%c",&c[i][j])&&c[i][j]!='.'&&c[i][j]!='*')            {                ;            }    }    memset(dp,0,sizeof(dp));    dp[1][1]=1;    for(i=1; i<=n; i++)    {        for(j=1; j<=i; j++)        {            if(c[i][j]=='*')            {                dp[i+1][j]+=dp[i][j];                dp[i+1][j+1]+=dp[i][j];            }            else                dp[i+2][j+1]=dp[i][j]*4;        }    }    j=1;    for(i=0; i<n; i++)        j=j<<1;    i=dp[n+1][m+1];    if(i==0)    {        printf("0/1\n");        return 0;    }    while(i%2==0)    {        i/=2;        j/=2;    }    printf("%I64d/%I64d\n",i,j);    return 0;}




0 0
原创粉丝点击