zoukankan      html  css  js  c++  java
  • UVa 10401 Injured Queen Problem(简单DP)

    题意:

    受伤的皇后只能攻击它这一列的,和它周围的九个格子。

    给定一个字符串,如果第i个字符是?则表示皇后能放在任意位置,如果不是?则表示它指定了必须放在哪一行,问有几种放法。

    思路:

    这种格子题目类似于小明回家,有几条路径可以选择一样,只不过初始点和结束状态不怎么一样而已。

    dp[i, j]表示(i, j)坐标最多有几种放法,dp[i, j]取决于dp[i-1, k],k取决于题目条件。

    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cctype>
    
    const int MAXN = 20;
    char b[MAXN];
    long long int dp[MAXN][MAXN];
    
    int main()
    {
        while (scanf("%s", b) == 1)
        {
            int n = strlen(b);
            memset(dp, 0, sizeof(dp));
    
            if (b[0] == '?')
            {
                for (int i = 0; i < n; ++i)
                    dp[0][i] = 1;
            }
            else
            {
                if (isdigit(b[0]))
                {
                    int k = b[0] - '1';
                    dp[0][k] = 1;
                }
                else 
                {
                    int k = b[0] - 'A' + 9;
                    dp[0][k] = 1;
                }
            }
    
            for (int i = 1; i < n; ++i)
            {
                if (b[i] == '?')
                {
                    for (int j = 0; j < n; ++j)
                    {
                        for (int k = 0; k < j - 1; ++k)
                            dp[i][j] += dp[i-1][k];
                        for (int k = j + 2; k < n; ++k)
                            dp[i][j] += dp[i-1][k];
                    }
                }
                else
                {
                    int j;
                    if (isdigit(b[i]))
                        j = b[i] - '1';
                    else
                        j = b[i] - 'A' + 9;
    
                    for (int k = 0; k < j - 1; ++k)
                        dp[i][j] += dp[i-1][k];
                    for (int k = j + 2; k < n; ++k)
                        dp[i][j] += dp[i-1][k];
                }
            }
            long long int ans = 0;
            for (int i = 0; i < n; ++i)
                ans += dp[n-1][i];
            printf("%lld\n", ans);
        }
        return 0;
    }
    -------------------------------------------------------

    kedebug

    Department of Computer Science and Engineering,

    Shanghai Jiao Tong University

    E-mail: kedebug0@gmail.com

    GitHub: http://github.com/kedebug

    -------------------------------------------------------

  • 相关阅读:
    web前段学习2017.6.15
    web前段学习2017.6.13
    web前端2017.6.10
    web前段2017.6.8
    web前段学习2016.6.6
    宏任务与微任务
    浏览器兼容性问题
    TCP 和 UDP 的区别
    React如何渲染大数据量的列表?
    移动端兼容性问题
  • 原文地址:https://www.cnblogs.com/kedebug/p/2781553.html
Copyright © 2011-2022 走看看