• 蓝桥杯 地宫取宝(12')


    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 3 2 

    1 2 3 

    2 1 5 

    程序应该输出:

    14 

     

    资源约定:

    峰值内存消耗< 256M 

    CPU消耗< 1000ms 

     

    请严格按要求输出,不要画蛇添足地打印类似:“请您输入...”的多余内容。

    所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

     

    注意: main函数需要返回0 

    注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。

    注意: 所有依赖的函数必须明确地在源文件中#include <xxx>,

    不能通过工程设置而省略常用头文件。

    提交时,注意选择所期望的编译器类型。

    快速解题思路:四维数组直接dfs记忆化啊,看到后面三个大题,就觉得这题最好下手,直接动手做,一个四维数组标记。

     

    代码:(dfs记忆化 12’ 应该没问题)

     1 #pragma comment(linker, "/STACK:1024000000,1024000000")
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<cmath>
     6 #include<math.h>
     7 #include<algorithm>
     8 #include<queue>
     9 #include<set>
    10 #include<bitset>
    11 #include<map>
    12 #include<vector>
    13 #include<stdlib.h>
    14 #include <stack>
    15 using namespace std;  
    16   
    17 #define eps 10e-10  
    18 #define N 1000000007  
    19   
    20 int ans;  
    21 int d[51][51][13][14];  
    22 int p[51][51];  
    23 int n,m,k;  
    24   
    25 int dfs(int x,int y,int num,int maxvalue){  
    26     if(d[x][y][num][maxvalue + 1] != -1){  
    27         return d[x][y][num][maxvalue + 1];  
    28     }  
    29     int t = 0;  
    30     if(x == n-1 && y == m-1){  
    31         if(p[x][y] > maxvalue){  
    32             if(num == k || num == k-1)t++;  
    33         }  
    34         else if(num == k){  
    35             t ++;  
    36         }  
    37         return d[x][y][num][maxvalue + 1] = t;  
    38     }  
    39   
    40     if(x + 1 < n){  
    41         if(p[x][y] > maxvalue){  
    42             t += dfs(x+1,y,num+1,p[x][y]);  
    43             t %= N;  
    44             t += dfs(x+1,y,num,maxvalue);  
    45             t %= N;  
    46         }  
    47         else {  
    48             t += dfs(x+1,y,num,maxvalue);  
    49             t %= N;  
    50         }  
    51     }  
    52   
    53     if(y + 1 < m){  
    54         if(p[x][y] > maxvalue){  
    55             t += dfs(x,y+1,num+1,p[x][y]);  
    56             t %= N;  
    57             t += dfs(x,y+1,num,maxvalue);  
    58             t %= N;  
    59         }  
    60         else {  
    61             t += dfs(x,y+1,num,maxvalue);  
    62             t %= N;  
    63         }  
    64     }  
    65     d[x][y][num][maxvalue + 1] = t;  
    66     return d[x][y][num][maxvalue + 1];  
    67 }  
    68   
    69 int main(){  
    70     while(cin>>n>>m>>k){  
    71         for(int i = 0; i < n; ++i){  
    72             for(int j = 0; j < m; ++j)  
    73             cin>>p[i][j];  
    74         }  
    75         memset(d,-1,sizeof(d));  
    76         d[0][0][0][0] = dfs(0,0,0,-1);  
    77         cout<<d[0][0][0][0]<<endl;  
    78     }  
    79     return 0;  
    80 }  
    View Code

     

  • 相关阅读:
    教大家如何在word 2007中同时打出对齐上下标以及字母头上有波浪线(非编辑器)
    C#返回多个参数 ref及out
    回溯法解决0-1背包问题
    USB peripherals can turn against their users
    50元制作PS2键盘无线监控装置
    物联网安全拔“牙”实战——低功耗蓝牙(BLE)初探
    Bluetooth Low Energy 嗅探
    MagSpoof:能预测并窃取你下一张信用卡号码的廉价设备
    Python 安全类目推荐 (持续更新)
    树莓派安装kali后的简单配置
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/5218449.html
Copyright © 2020-2023  润新知