码迷,mamicode.com
首页 > 其他好文 > 详细

蓝桥杯 地宫取宝(12')

时间:2016-02-25 22:45:00      阅读:350      评论:0      收藏:0      [点我收藏+]

标签:

 

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

 

 

 

蓝桥杯 地宫取宝(12')

标签:

原文地址:http://www.cnblogs.com/UniqueColor/p/5218449.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!