摘花生 刷题笔记

本文介绍了使用动态规划方法解决一个实际问题,即在给定网格中找到从左上角走到右下角,每次选择向右或向下移动,累计收获花生的最大值。代码展示了如何通过计算每个位置的左侧和上方花生数的最大值来求解此问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

思路 dp
开一个 f[N][N]数组
f[i][j]表示 当走到位置i,j时 所摘到的花生的最大值 
对于任意一个位置i,j
因为只能向东或者向南走
所以 当前花生最大值只能来自左边或者上面
第i,j号位置的花生数 已经确定
所以只需取左边和上面的花生数的最大值即可
即f[i][j]=max(f[i-1][j],f[i][j-1])+w[i][j];
f[i-1][j]就是当前位置的左边花生数
f[i][j-1]则是上面的花生数 
因为每一次的选择都是基于左边和上边取得最大值
所以总体最大

代码

#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
const int N=110;
int w[N][N],f[N][N];
int main(){
    int n;
    cin>>n;
    while(n--){
        int r,c;
        cin>>r>>c;
        for(int i=1;i<=r;i++){
            for(int j=1;j<=c;j++){
                cin>>w[i][j];
                f[i][j]=max(f[i-1][j],f[i][j-1])+w[i][j];
            }
        }
        
        cout<<f[r][c]<<endl;
    } 
    
    
    return 0;
}

### 关于C语言实现花生 以下是基于动态规划的思想,提供一种解决“花生”问的C语言实现方案。通过构建二维数组存储路径中的最大值,并逐步更新最优解。 #### 动态规划的核心思想 为了求解 Hello Kitty 能够取的最大花生数量,可以采用动态规划方法。设 `dp[i][j]` 表示到达第 `(i,j)` 位置时所能获得的最大花生数。状态转移方程为: \[ dp[i][j] = \max(dp[i-1][j], dp[i][j-1]) + grid[i][j] \] 其中: - 如果当前位置是从上方移动过来,则其值等于上方格子的最大值加上当前格子的花生数; - 如果当前位置是从左方移动过来,则其值等于左方格子的最大值加上当前格子的花生数。 初始条件设置为起点处的花生数 \( dp[0][0] = grid[0][0] \)。 下面是完整的 C 语言代码实现: ```c #include <stdio.h> #define MAXN 105 int main() { int t; scanf("%d", &t); while (t--) { int r, c; scanf("%d %d", &r, &c); // 初始化地图和 DP 数组 int map[MAXN][MAXN]; int dp[MAXN][MAXN]; for (int i = 0; i < r; ++i) { for (int j = 0; j < c; ++j) { scanf("%d", &map[i][j]); } } // 填充边界条件 dp[0][0] = map[0][0]; // 初始点 for (int i = 1; i < r; ++i) { // 左边界的初始化 dp[i][0] = dp[i - 1][0] + map[i][0]; } for (int j = 1; j < c; ++j) { // 上边界的初始化 dp[0][j] = dp[0][j - 1] + map[0][j]; } // 动态规划填表 for (int i = 1; i < r; ++i) { for (int j = 1; j < c; ++j) { dp[i][j] = ((dp[i - 1][j] > dp[i][j - 1]) ? dp[i - 1][j] : dp[i][j - 1]) + map[i][j]; } } printf("%d\n", dp[r - 1][c - 1]); // 输出最终结果 } return 0; } ``` 此程序实现了多组测试数据的支持,按照输入格式读入每一组的数据并计算出对应的结果[^4]。 ### 注意事项 上述代码假设所有输入均合法,即满足给定约束条件下的矩阵大小与数值范围。实际应用中可能还需要加入额外错误处理逻辑来应对非法输入情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值