• [蓝桥杯][2014年第五届真题]地宫取宝


    题目描述
    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  3  2 
    1  2  3 
    2  1  5 
    样例输出
    14
     
    这个题对我来说帮助就有点大,感觉通过这个题总算大概的知道了dfs加记忆数组的基本“套路”了,首先把所有的参数和处理数据”导入“dfs的函数中,进行”本层“的数据处理(特别注意这一点,不要直接进行下一层的统计,这样会遗漏一些,比如(0,0)),用一种统计的变量统计可以出现的方案数,用一个记忆数组统计已经统计过的方案数,防止重复递归。
    #include<iostream>
    #include<cstdio>
    #include<cstdio>
    #include<cstring>
    #include<string>
    #include<map>
    using namespace std;
    int re[51][51][51][15], n, m, k;
    int mp[150][150];
    const int mod = 1000000007;
    int dfs(int x, int y, int Sum, int maxn)
    {
    	if (re[x][y][Sum][maxn+1] != -1) return re[x][y][Sum][maxn+1];
    	if (x == n - 1 && y == m - 1)
    	{
    		if (Sum == k) return 1;
    		if (Sum == k - 1 && maxn < mp[x][y]) return 1;
    	}
    	int t = 0;
    	if (x < n - 1)
    	{
    		if (mp[x][y] > maxn)
    			t = (t+ dfs(x + 1, y, Sum + 1, mp[x][y]))%mod;
    		t = (t + dfs(x + 1, y, Sum, maxn))%mod;
    	}
    	if (y < m - 1)
    	{
    		if (mp[x][y] > maxn)
    			t = (t + dfs(x, y + 1, Sum + 1, mp[x][y ])) % mod;
    		t = (t + dfs(x, y + 1, Sum, maxn)) % mod;
    	}
    	re[x][y][Sum][maxn+1] = t;
    	return t;
    }
    int main()
    {
    	cin >> n >> m >> k;
    	for (int i = 0; i < n; i++)
    		for (int j = 0; j < m; j++) cin >> mp[i][j];
    	memset(re, -1, sizeof(re));
    	cout << dfs(0, 0, 0, -1) << endl;
    	return 0;
    }
    
     



  • 相关阅读:
    CodeForces 156B Suspects(枚举)
    CodeForces 156A Message(暴力)
    CodeForces 157B Trace
    CodeForces 157A Game Outcome
    HDU 3578 Greedy Tino(双塔DP)
    POJ 2609 Ferry Loading(双塔DP)
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛 19000互质的个数
    Java 第十一届 蓝桥杯 省模拟赛十六进制转换成十进制
  • 原文地址:https://www.cnblogs.com/kangdong/p/10312849.html
Copyright © 2020-2023  润新知