zoukankan      html  css  js  c++  java
  • 蓝桥杯-地宫取宝

    http://lx.lanqiao.cn/problem.page?gpid=T120
     
    问题描述
     
      X 国王有一个地宫宝库。是 n x m 个格子的矩阵。每个格子放一件宝贝。每个宝贝贴着价值标签。

      地宫的入口在左上角,出口在右下角。

      小明被带到地宫的入口,国王要求他只能向右或向下行走。

      走过某个格子时,如果那个格子中的宝贝价值比小明手中任意宝贝价值都大,小明就可以拿起它(当然,也可以不拿)。

      当小明走到出口时,如果他手中的宝贝恰好是k件,则这些宝贝就可以送给小明。

      请你帮小明算一算,在给定的局面下,他有多少种不同的行动方案能获得这k件宝贝。
     
    输入格式
      输入一行3个整数,用空格分开:n m k (1<=n,m<=50, 1<=k<=12)

      接下来有 n 行数据,每行有 m 个整数 Ci (0<=Ci<=12)代表这个格子上的宝物的价值
    输出格式
      要求输出一个整数,表示正好取k个宝贝的行动方案数。该数字可能很大,输出它对 1000000007 取模的结果。
     
    样例输入
    2 2 2
    1 2
    2 1
    样例输出
    2
    样例输入
    2 3 2
    1 2 3
    2 1 5
    样例输出
    14
     
    dp(i,j,k,l) :代表走到(i,j),最大值为k,已选取个数为l的最大方案数
    注意两点:
    1.dp在加的时候要mod
    2.输入a[i][j]的时候,要加一,与0不取区分开(因为价值有0的情况)
     
    自己更新别人
    // 去吧!皮卡丘! 把AC带回来!
    //      へ     /|
    //   /\7    ∠_/
    //   / │   / /
    //  │ Z _,< /   /`ヽ
    //  │     ヽ   /  〉
    //  Y     `  /  /
    //  イ● 、 ●  ⊂⊃〈  /
    //  ()  へ    | \〈
    //   >ー 、_  ィ  │ //
    //   / へ   / ノ<| \\
    //   ヽ_ノ  (_/  │//
    //    7       |/
    //    >―r ̄ ̄`ー―_
    //**************************************
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define inf 2147483647
    const ll INF = 0x3f3f3f3f3f3f3f3fll;
    #define ri register int
    template <class T> inline T min(T a, T b, T c) { return min(min(a, b), c); }
    template <class T> inline T max(T a, T b, T c) { return max(max(a, b), c); }
    template <class T> inline T min(T a, T b, T c, T d) {
      return min(min(a, b), min(c, d));
    }
    template <class T> inline T max(T a, T b, T c, T d) {
      return max(max(a, b), max(c, d));
    }
    #define scanf1(x) scanf("%d", &x)
    #define scanf2(x, y) scanf("%d%d", &x, &y)
    #define scanf3(x, y, z) scanf("%d%d%d", &x, &y, &z)
    #define scanf4(x, y, z, X) scanf("%d%d%d%d", &x, &y, &z, &X)
    #define pi acos(-1)
    #define me(x, y) memset(x, y, sizeof(x));
    #define For(i, a, b) for (int i = a; i <= b; i++)
    #define FFor(i, a, b) for (int i = a; i >= b; i--)
    #define bug printf("***********
    ");
    #define mp make_pair
    #define pb push_back
    const int maxn = 2e5 + 10;
    // name*******************************
    int n, m, K;
    int a[55][55];
    int dp[55][55][14][14];
    int ans = 0;
    int mod = 1000000007;
    // function******************************
    
    //***************************************
    int main() {
      // ios::sync_with_stdio(0); cin.tie(0);
      // freopen("test.txt", "r", stdin);
      //  freopen("outout.txt","w",stdout);
      cin >> n >> m >> K;
      For(i, 1, n) {
        For(j, 1, m) {
          cin >> a[i][j];
          a[i][j]++;
        }
      }
      memset(dp, 0, sizeof(dp));
      dp[1][1][a[1][1]][1] = 1;
      dp[1][1][0][0] = 1;
      For(i, 1, n) {
        For(j, 1, m) {
          For(k, 0, 13) {
            For(l, 0, K) {
              if (dp[i][j][k][l] == 0)
                continue;
              if (k < a[i + 1][j]) {
                dp[i + 1][j][a[i + 1][j]][l + 1] += dp[i][j][k][l];
                dp[i + 1][j][a[i + 1][j]][l + 1] %= mod;
              }
              if (k < a[i][j + 1]) {
                dp[i][j + 1][a[i][j + 1]][l + 1] += dp[i][j][k][l];
                dp[i][j + 1][a[i][j + 1]][l + 1] %= mod;
              }
              dp[i + 1][j][k][l] += dp[i][j][k][l];
              dp[i + 1][j][k][l] %= mod;
              dp[i][j + 1][k][l] += dp[i][j][k][l];
              dp[i][j + 1][k][l] %= mod;
              // cout << dp[i][j][k][l] << " ";
            }
          }
        }
        // cout << endl;
      }
    
      For(i, 0, 13) {
        ans += dp[n][m][i][K];
        ans %= mod;
      }
      cout << ans;
      return 0;
    }
    View Code

    别人更新自己 

    // 去吧!皮卡丘! 把AC带回来!
    //      へ     /|
    //   /\7    ∠_/
    //   / │   / /
    //  │ Z _,< /   /`ヽ
    //  │     ヽ   /  〉
    //  Y     `  /  /
    //  イ● 、 ●  ⊂⊃〈  /
    //  ()  へ    | \〈
    //   >ー 、_  ィ  │ //
    //   / へ   / ノ<| \\
    //   ヽ_ノ  (_/  │//
    //    7       |/
    //    >―r ̄ ̄`ー―_
    //**************************************
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define inf 2147483647
    const ll INF = 0x3f3f3f3f3f3f3f3fll;
    #define ri register int
    template <class T> inline T min(T a, T b, T c) { return min(min(a, b), c); }
    template <class T> inline T max(T a, T b, T c) { return max(max(a, b), c); }
    template <class T> inline T min(T a, T b, T c, T d) {
      return min(min(a, b), min(c, d));
    }
    template <class T> inline T max(T a, T b, T c, T d) {
      return max(max(a, b), max(c, d));
    }
    #define scanf1(x) scanf("%d", &x)
    #define scanf2(x, y) scanf("%d%d", &x, &y)
    #define scanf3(x, y, z) scanf("%d%d%d", &x, &y, &z)
    #define scanf4(x, y, z, X) scanf("%d%d%d%d", &x, &y, &z, &X)
    #define pi acos(-1)
    #define me(x, y) memset(x, y, sizeof(x));
    #define For(i, a, b) for (int i = a; i <= b; i++)
    #define FFor(i, a, b) for (int i = a; i >= b; i--)
    #define bug printf("***********
    ");
    #define mp make_pair
    #define pb push_back
    const int maxn = 2e5 + 10;
    // name*******************************
    int n, m, K;
    int a[55][55];
    int dp[55][55][15][15];
    int ans = 0;
    int mod = 1000000007;
    // function******************************
    
    //***************************************
    int main() {
      // ios::sync_with_stdio(0); cin.tie(0);
      // freopen("test.txt", "r", stdin);
      //  freopen("outout.txt","w",stdout);
      cin >> n >> m >> K;
      For(i, 1, n) {
        For(j, 1, m) {
          cin >> a[i][j];
          a[i][j]++;
        }
      }
      memset(dp, 0, sizeof(dp));
      dp[1][1][a[1][1]][1] = 1;
      dp[1][1][0][0] = 1;
      For(i, 1, n) {
        For(j, 1, m) {
          if (i == 1 && j == 1)
            continue;
          For(k, 0, 13) {
            For(l, 0, K) {
              if (a[i][j] > k) {
                dp[i][j][a[i][j]][l + 1] += dp[i - 1][j][k][l];
                dp[i][j][a[i][j]][l + 1] %= mod;
                dp[i][j][a[i][j]][l + 1] += dp[i][j - 1][k][l];
                dp[i][j][a[i][j]][l + 1] %= mod;
              }
              dp[i][j][k][l] += dp[i][j - 1][k][l];
              dp[i][j][k][l] %= mod;
              dp[i][j][k][l] += dp[i - 1][j][k][l];
              dp[i][j][k][l] %= mod;
            }
          }
        }
      }
    
      For(i, 0, 12) {
        ans += dp[n][m][i][K];
        ans %= mod;
      }
      cout << ans;
      return 0;
    }
    View Code
  • 相关阅读:
    SpringMVC常用注解
    在Java 中,如何跳出当前的多重嵌套循环?
    当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
    查看远程库信息(git remote的用法)
    webpack和gulp的比较
    git pull 和git fetch的区别
    什么是性能优化?
    第一阶段的任务及燃尽图(第五天)
    第一阶段的任务及燃尽图(第二天)
    第一阶段的任务及燃尽图(第一天)
  • 原文地址:https://www.cnblogs.com/planche/p/8552164.html
Copyright © 2011-2022 走看看