poj 1189 dp(钉子和小球)

本文介绍了一种基于动态规划的模拟算法,用于解决钉子下落问题。通过为每个钉子分配权重并递归计算指定位置的最终权重,文章详细解释了实现步骤和关键代码。适用于对动态规划及模拟算法感兴趣的学习者。

题意:中文题目看题即可。

思路:将最顶上的钉子给予权值2^n,然后模拟其下落过程,计算最终落到指定位置的权值是多少即可。注意中间任意位置的权值可能来源于三个部分,1、左上位置;2、右上位置;3、如果正上方没有钉子,则来源于正上方。采用递归式的动态规划,因为可能某些钉子的权值不必求出。

#include <stdio.h>
#include <string.h>
#define N 55
char buf[1024];
int s[N][N];
long long dp[N][N],fz,fm;
int n,m;
long long gcd(long long  x,long long y){
    if(!y)
        return x;
    return gcd(y,x%y);
}
long long fun(int x,int y){
    long long res = 0;
    if(dp[x][y])
        return dp[x][y];
    if(x!=y && s[x-1][y])
        res += fun(x-1,y)/2;
    if(y!=1 && s[x-1][y-1])
        res += fun(x-1,y-1)/2;
    if(x>2 && y<x && !s[x-2][y-1])
        res += fun(x-2,y-1);
    return dp[x][y] = res;
}
int main(){
    while(scanf("%d %d\n",&n,&m)!=EOF){
        int i,j,k;
        long long temp;
        memset(s,0,sizeof(s));
        memset(dp,0,sizeof(dp));
        for(i = 1;i<=n;i++){
            gets(buf);
            for(j = 0,k = 1;k<=i;j++)
                if(buf[j]!=' '){
                    if(buf[j] == '*')
                        s[i][k] = 1;
                    k++;
                }
        }
        
        fm = dp[1][1] = (long long)1<<n;
        fz = fun(n+1,m+1);
        temp = gcd(fz,fm);
        if(fz == 0)
            printf("0/1\n");
        else
            printf("%lld/%lld\n",fz/temp,fm/temp);
    }
    return 0;
}


下载前可以先看下教程 https://pan.quark.cn/s/16a53f4bd595 小天才电话手表刷机教程 — 基础篇 我们将为您简单的介绍小天才电话手表新机型的简单刷机以及玩法,如adb工具的使用,magisk的刷入等等。 我们会确保您看完此教程后能够对Android系统有一个最基本的认识,以及能够成功通过magisk root您的手表,并安装您需要的第三方软件。 ADB Android Debug Bridge,简称,在android developer的adb文档中是这么描述它的: 是一种多功能命令行工具,可让您与设备进行通信。 该命令有助于各种设备操作,例如安装调试应用程序。 提供对 Unix shell 的访问,您可以使用它在设备上运行各种命令。 它是一个客户端-服务器程序。 这听起来有些难以理解,因为您也没有必要去理解它,如果您对本文中的任何关键名词产生疑惑或兴趣,您都可以在搜索引擎中去搜索它,当然,我们会对其进行简单的解释:是一款在命令行中运行的,用于对Android设备进行调试的工具,并拥有比一般用户以及程序更高的权限,所以,我们可以使用它对Android设备进行最基本的调试操作。 而在小天才电话手表上启用它,您只需要这么做: - 打开拨号盘; - 输入; - 点按打开adb调试选项。 其次是电脑上的Android SDK Platform-Tools的安装,此工具是 Android SDK 的组件。 它包括与 Android 平台交互的工具,主要由构成,如果您接触过Android开发,必然会使用到它,因为它包含在Android Studio等IDE中,当然,您可以独立下载,在下方选择对应的版本即可: - Download SDK Platform...
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值