ACWing动态规划DP采花生

​​​​Hello Kitty想摘点花生送给她喜欢的米老鼠。

她来到一片有网格状道路的矩形花生地(如下图),从西北角进去,东南角出来。

地里每个道路的交叉点上都有种着一株花生苗,上面有若干颗花生,经过一株花生苗就能摘走该它上面所有的花生。

Hello Kitty只能向东或向南走,不能向西或向北走。

问Hello Kitty最多能够摘到多少颗花生。

输入格式

第一行是一个整数T,代表一共有多少组数据。

接下来是T组数据。

每组数据的第一行是两个整数,分别代表花生苗的行数R和列数 C。

每组数据的接下来R行数据,从北向南依次描述每行花生苗的情况。每行数据有C个整数,按从西向东的顺序描述了该行每株花生苗上的花生数目M。

输出格式

对每组输入数据,输出一行,内容为Hello Kitty能摘到得最多的花生颗数。

数据范围

1≤T≤1001≤T≤100,
1≤R,C≤1001≤R,C≤100,
0≤M≤10000≤M≤1000

输入样例:

2
2 2
1 1
3 4
2 3
2 3 4
1 6 5

输出样例:

8
16

一道非常基础的动态规划问题

本题的模型是数字三角形。

这里我们从集合的角度来分析一下(闫式DP分析法)

我们需要从(1 , 1)这个位置走到(n , m) ,找到最后采得花生最多的方法。

我们可以先这样想,假设我们要求得某一条路线走到dp(i . j)时所采得的花生数量,那么我们可以这样想(曲线救国) :计算走到dp(i  , j)前一步花生的数量 , 然后再加上最后一步所得到的花生的数量即可,因此dp[i][j] 可以由dp[i - 1][j](左侧走过来) dp[i][j - 1](右侧走过来),我们只需要找到两条路线中其中采得花生多的一条路径即可

因此dp(n , m)就是采得花生的最大值

代码就直接附在下面,有需要可以参考一下

#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 510;
int g[N][N];
int dp[N][N];
int t;
int n , m;
int main()
{
    cin >> t;
    while(t --){
        cin >> n >> m;
        for(int i = 1 ; i <= n ; i ++){
            for(int j = 1 ; j <= m ; j ++){
                cin >> g[i][j];
            }
        }
        for(int i = 1 ; i <= n ; i ++){
            for(int j = 1 ; j <= m ; j ++){
                dp[i][j] = max(dp[i - 1][j] + g[i][j] , dp[i][j - 1] + g[i][j]);
            }
        }
        cout << dp[n][m] << endl;
    }
    return 0;
}

### AcWing 平台上的动态规划资源 #### 动态规划教程概述 AcWing 提供了一系列针对不同难度级别的动态规划(DP)教程,帮助学习者逐步掌握这一重要算法设计技术。这些课程通常从基础概念出发,介绍状态定义、转移方程构建以及边界条件处理等内容[^2]。 #### 经典题目示例 以斐波那契数列为例,在给定整数`n`的情况下计算第`n`项的值是一个典型的入门级DP问题。通过预先设定初始值并利用迭代方式更新后续各项数值来解决问题。具体实现如下所示: ```cpp #include <cstdio> const int N = 30; int fib[N]; void solve_fibonacci(int n){ fib[1] = 1; fib[2] = 2; if (n <= 2) { printf("%d\n", fib[n]); return ; } for (int i = 3; i <= n ; ++i ) fib[i] = fib[i - 1] + fib[i - 2]; printf("%d\n",fib[n]); } ``` 此代码片段展示了如何运用自底向上方法解决简单线性递推关系型DP问题。 #### 复杂度更高的案例分析 当面对更复杂的场景时,比如涉及多个阶段决策过程的问题,如石子合并游戏中的最小化总成本策略,则需要考虑更多维度的状态表示形式及其转换逻辑。在这个例子中,为了使最终得分尽可能低,应当优先选择那些能够带来较小增量开销的操作组合[^3]。 例如,如果有三堆石头分别含有数量为 `a`, `b`, 和 `c` 的石子,那么最优方案可能不是直接将前两堆合在一起再加第三堆,而是寻找一种顺序使得每次操作产生的额外费用最少。这涉及到对所有可能性进行全面评估,并从中挑选出最佳路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值