zoukankan      html  css  js  c++  java
  • HDU 1208 跳格子题(很经典,可以有很多变形)

    题目链接:

    http://acm.hdu.edu.cn/showproblem.php?pid=1208

    Pascal's Travels

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 2795    Accepted Submission(s): 1298


    Problem Description
    An n x n game board is populated with integers, one nonnegative integer per square. The goal is to travel along any legitimate path from the upper left corner to the lower right corner of the board. The integer in any one square dictates how large a step away from that location must be. If the step size would advance travel off the game board, then a step in that particular direction is forbidden. All steps must be either to the right or toward the bottom. Note that a 0 is a dead end which prevents any further progress.


    Consider the 4 x 4 board shown in Figure 1, where the solid circle identifies the start position and the dashed circle identifies the target. Figure 2 shows the three paths from the start to the target, with the irrelevant numbers in each removed.


    Figure 1


    Figure 2
     
    Input
    The input contains data for one to thirty boards, followed by a final line containing only the integer -1. The data for a board starts with a line containing a single positive integer n, 4 <= n <= 34, which is the number of rows in this board. This is followed by n rows of data. Each row contains n single digits, 0-9, with no spaces between them.
     
    Output
    The output consists of one line for each board, containing a single integer, which is the number of paths from the upper left corner to the lower right corner. There will be fewer than 2^63 paths for any board.
     
    Sample Input
    4
    2331
    1213
    1231
    3110
    4
    3332
    1213
    1232
    2120
    5
    11101
    01111
    11111
    11101
    11101
    -1
     
    Sample Output
    3
    0
    7
    Hint
    Hint
    Brute force methods examining every path will likely exceed the allotted time limit. 64-bit integer values are available as "__int64" values using the Visual C/C++ or "long long" values using GNU C/C++ or "int64" values using Free Pascal compilers.
     
    Source
    分析;
    看到一句话:
     所谓动态规划,就是每一个阶段你要做出一个决策,从最开始的决策到结束的决策的集合叫做一个策略,而各个阶段决策的多样性直接导致了策略的多样性,而我们一般求得的不是最有策略结束最大最小花费策略,每一个阶段的决策在这种有目的的作用下都与上一个阶段的决策相关,我们用记录这个阶段的一个东西(通常是动态数组)来记录这个状态符合我们需要的策略的决策
     
    唉,还是不能很好的理解dp思想
     
    本题分析;
    要 求左上角到右下角的方法数
    每次只能往下或者往右跳,跳的格子数必须等于现在站的格子的权值(不能少跳,比如你站的格子中权值是3,那么你在不超出边界的条件下你一定要跳3个格子),这样一来,有的格子可能跳不到,而有的格子可能有多种到达的方式
     
     
    dp[i][j] 表示到达i,j的方法数目
    注意:
    1.初始化问题:dp初始化为0,dp[0][0]=1
    2.状态转移方程:
      dp[i][j+a[i][j]]+=dp[i][j];
      dp[i+a[i][j]][j]+=dp[i][j];
    不超边界的前提下(j+a[i][j]<n   i+a[i][j]<n)
    3.long long 类型(注意题目中拿到2的63次方)
    代码如下:
    #include<bits/stdc++.h>
    using namespace std;
    #define max_v 40
    long long dp[max_v][max_v];//dp[i][j] 表示到达i行j列有多少种走法
    long long a[max_v][max_v];
    char s[max_v];
    int main()
    {
        int n;
        while(~scanf("%d",&n))
        {
            if(n==-1)
                break;
            getchar();
            for(int i=0;i<n;i++)
            {
                scanf("%s",s);
                for(int j=0;j<strlen(s);j++)
                {
                    a[i][j]=s[j]-'0';
                }
            }
            memset(dp,0,sizeof(dp));
            dp[0][0]=1;
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<n;j++)
                {
                    if(a[i][j]==0)//防止死循环
                        continue;
                    if(j+a[i][j]<n)//向右边跳
                    {
                        dp[i][j+a[i][j]]+=dp[i][j];
                    }
                    if(i+a[i][j]<n)//向下跳
                    {
                        dp[i+a[i][j]][j]+=dp[i][j];
                    }
                }
            }
            printf("%lld
    ",dp[n-1][n-1]);
        }
        return 0;
    }
    

      

  • 相关阅读:
    BZOJ 2594: [Wc2006]水管局长数据加强版
    BZOJ 2049: [Sdoi2008]Cave 洞穴勘测
    html5 canvas ( 贝塞尔曲线, 一片星空加绿地 ) quadraticCurveTo, bezierCurveTo
    c#.net 接收 base64 格式的数据并解析为图片
    html5 canvas ( 绘制一轮弯月, 星空中的弯月 )
    html5 canvas ( 圆和切点曲线的绘制 ) arc, arcTo
    html5 canvas ( 图片填充样式 ) fillStyle, createPattern
    html5 canvas ( 径向渐变, 升级版的星空 ) fillStyle, createRadialGradient
    html5 canvas ( 线性渐变, 升级版的星空 ) fillStyle, createLinearGradient, addColorStop
    html5 canvas ( 图形变换矩阵 ) transform, setTransform
  • 原文地址:https://www.cnblogs.com/yinbiao/p/9158839.html
Copyright © 2011-2022 走看看