zoukankan      html  css  js  c++  java
  • 蓝桥杯 地宫取宝(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

     

  • 相关阅读:
    Insus Meta Utility
    The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine.
    Insus Binary Utility
    asp.net实现文件下载功能
    Column 'Column Name' does not belong to table Table
    程序已被编译为DLL,怎样去修改程序功能
    如何在Web网站实现搜索功能
    如何把数据流转换为二进制字符串
    Asp.net更新文件夹的文件
    如何显示中文月份
  • 原文地址:https://www.cnblogs.com/UniqueColor/p/5218449.html
Copyright © 2011-2022 走看看