首页 > 其他分享 >蓝桥杯-地宫取宝

蓝桥杯-地宫取宝

时间:2024-03-09 22:35:58浏览次数:36  
标签:int 蓝桥 ++ grid 地宫 宝物 取宝 dp

这是一个dp题,可以用4维数据来表示所有的状态。
但是有一个需要注意的点,一般来说,对于每个坐标,有拿跟不拿两种情况,如果没有拿任务宝物的状态表示为0,那么拿取了价值为0的宝物时,要以另一种情况来跟没拿区分。 处理的方法就是将所有宝物的价格+1。

long long dp[55][55][15][15];
constexpr int mod = 1e9 + 7;
void solve(){
    memset(dp, 0ll, sizeof(dp));
    int n, m, k;
    cin >> n >> m >> k;

    vector<vector<int>> grid(n, vector<int>(m));
    for (int i = 0; i < n; ++i){
        for (int j = 0; j < m; ++j){
            cin >> grid[i][j];
            grid[i][j] ++;
        }
    }

    dp[0][0][1][grid[0][0]] = 1;
    dp[0][0][0][0] = 1;
    for (int i = 0; i < n; ++i){
        for (int j = 0; j < m; ++j){
            if (!i && !j){
                continue;
            }
            int cur = grid[i][j];
            if (i){
                for (int u = 0; u <= k; ++u){
                    for (int v = 0; v <= 15; ++v){
                        dp[i][j][u][v] = dp[i - 1][j][u][v];
                    }
                }
                for (int u = 1; u <= k; ++u){
                    for (int v = 0; v < cur; ++v){
                        dp[i][j][u][cur] += dp[i - 1][j][u - 1][v];
                    }
                    dp[i][j][u][cur] %= mod;
                }
            }
            if (j){
                for (int u = 0; u <= k; ++u){
                    for (int v = 0; v <= 15; ++v){
                        dp[i][j][u][v] += dp[i][j - 1][u][v];
                    }
                }
                for (int u = 1; u <= k; ++u){
                    for (int v = 0; v < cur; ++v){
                        dp[i][j][u][cur] += dp[i][j - 1][u - 1][v];
                    }
                    dp[i][j][u][cur] %= mod;
                }
            }
        }
    }

    long long ans = 0;
    for (int u = 0; u <= 12; ++u){
        ans = (ans + dp[n - 1][m - 1][k][u]) % mod;
    }

    cout << ans << endl;
}

//题目不难,但是没注意到这种价值为0的情况,少见!!

标签:int,蓝桥,++,grid,地宫,宝物,取宝,dp
From: https://www.cnblogs.com/yxcblogs/p/18063499

相关文章

  • 【蓝桥-大试牛刀7-最短路专场】一点提示
    最短路1求个全源最短路。看数据范围\(1\len\le100\),直接floyd秒掉就行。最短路2先判负环,用Bellman-Ford,当然建议用队列优化版的(国内一般叫spfa)。虽然说spfa复杂度不稳定,但也一定比朴素版要快一点的。第二步还是求全源最短路,但是这个题的数据范围到了\(1\len\le3\times10^3......
  • [蓝桥杯 2019 省 B] 后缀表达式
    这题没想到怎么贪心,看题解恍然大明白#include<iostream>#include<stdio.h>#include<algorithm>#include<string>#defineFor(i,j,n)for(inti=j;i<=n;++i)usingnamespacestd;typedeflonglongLL;constintN=2e5+5;LLans;in......
  • [蓝桥杯 2019 省 B] 等差数列
    实际上这道题不需要先排序再求gcd,因为无论是哪两项之前作差,都不会影响最后的gcd的结果。因为公差是从a2-a1开始算的,因此i=1时要特殊处理,不能把a1-0计入贡献,否则会算出错误的gcd。即作差时不要加上a1-0,统计最值时不要漏掉a1#include<iostream>#include<stdio.h>#include<a......
  • Java蓝桥杯题目——1264排个序
    题目 思路:1、输入数据2、用冒泡排序将数组(下标为pj的)部分升序,3、判断是否有前一个元素大于后一个元素(降序),有则返回false注意:(1)数组p元素的取值不能大于数组a的长度,因为p元素是a的下标(2)数组下标越界问题,使用i<a.length判断(3)并非所有元素都要降序才返回false,只要有前一个元......
  • 每天一道蓝桥杯 Day2 翻转+阶乘求和
    阶乘求和 只要后9位的话,那就只考虑后9位!如何只算后9位?有一个很经典的运算:取模。回想入门c语言时做过一道题,给定三位数,要求进行数字翻转。比如给定n,n=123,要翻转成321。一个做法是令a1=n%10,a2=(n%100)/10,a3=n/100输出a1*100+a2*10+a3即可。所以遇到求一个很大的值除以某数......
  • P8630 [蓝桥杯 2015 国 B] 密文搜索
    网站:https://www.luogu.com.cn/problem/P8630代码如下:主要是用了map的思想#include<iostream>#include<vector>#include<algorithm>#include<math.h>#include<string>#include<string.h>#include<iomanip>#include<map>#incl......
  • 第十二届蓝桥杯填空题
    目录试题A:卡片法一、暴力测试法法二、另解试题B:直线题解试题C:货物摆放法一、暴力法二、在遍历之前筛掉不是n的因数的试题D:路径法一、改进的迪杰斯特拉算法法二、动态规划试题E:回路计数法一、试题A:卡片分析:11年是从1到2020,2出现的次数,这个题感觉反过来了,求1到多少0-9出现的次数......
  • 2023年第十四届蓝桥杯大赛软件类省赛Java大学B组真题
    2023年第十四届蓝桥杯大赛软件类省赛Java大学B组真题C.数组分割思路:因为最后要是分为2组偶数。由于偶数+偶数=偶数,奇数+奇数=偶数。那么我们的奇数个数一定要是偶数个。如果奇数个数为奇数个那直接就不行了,答案是0。如果奇数的个数是偶数的话,假设偶数n个,奇数m个。\(C_{n}^{0}+......
  • 每天一道蓝桥杯Day1 分考场(dfs+结论)
    题意:这道题第一眼咋看以为是图论,但是要抽象成图论的话就会变成:给定一个无向图,要求对点染色,使得任意相邻点之间颜色不能相同,试问最少的颜色数是多少?发现转化成图论后好像也没有什么图论算法可以解决,这个转化不是很有效。往往不知道怎么下手时可以试着考虑极端情况,比如考虑上界......
  • P8686 [蓝桥杯 2019 省 A] 修改数组
    备赛蓝桥杯和icpc的习题:一道并查集的题目>#include<iostream>>#include<vector>>#include<algorithm>>#include<math.h>>#include<string>>#include<string.h>>#include<iomanip>>#include<map>&g......