摘花生c++

news2024/9/30 11:27:07
题目

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

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

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

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

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

1.gif

输入格式

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

接下来是T组数据。

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

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

输出格式

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

数据范围

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

输入样例:

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

输出样例:

8
16

思路1

         本题涉及到最优解,考虑使用DP(动态规划)来做。对于动态规划的题,从状态表示和状态计算两方面考虑。

        对于状态表示,又可以从集合定义和集合的属性两方面考虑。对于本题,我将集合f(i, j)定义为从某坐标(i, j)出发的所有路径,属性(即f(i, j)存的值)定义为摘到花生的最大数量。

        而状态计算对应着集合的划分。对于本题,可以按第一步往哪个方向走来划分集合,分为两个小的集合:第一步向东走的,第一步向南走的。假设用二维数组a存每个坐标的花生数量。对于第一步向东走的集合,路径为:(1, 1) ->(1, 2) ->……,第一步都是在(1, 1)这个坐标,那摘到的花生数可以设为f(1, 1) = m(1, 1) + f(1, 2)。同理,对于第一步向南走的集合,路径为:(1, 1) ->(2, 1) ->……,第一步都是在(1, 1)这个坐标,那摘到的花生数可以设为f(1, 1) = m(1, 1) + f(2, 1)。然后两个小集合的最大值即可得到整个集合的最大值。

        有人疑惑为什么这样可以摘到从西北角到东南角最大的花生数量。因为对于某个坐标,我们都会遍历东南两个方向,因此一定会到达东南角的。

代码1
#include<bits/stdc++.h>
using namespace std;

const int N = 110;
int t, r, c, m;

//a存各坐标花生数;total[i][j]存从(i, j)开始能获得的最大花生数量,为记忆化数组
int a[N][N], total[N][N];
int dx[] = {0, 1}, dy[] = {1, 0};

int dfs(int x, int y)
{
  int &v = total[x][y];

/*
对total[x][y]的各位取反,判断total[x][y]是否为-1,-1(1111 1111 1111 1111)取反后变为为0;
不为-1说明从(x, y)开始的路径已经遍历(记忆)过了,不需要重新遍历(记忆)
*/
  if (~v)
  return v;
  
  v = a[x][y];
  
  for (int i = 0; i < 2; i ++)
  {
    int nx = dx[i] + x, ny = dy[i] + y;
    //合理的坐标才能继续摘花生
    if (nx >= 1 && nx <= r && ny >= 1 && ny <= c)
    v = max(v, dfs(nx, ny) + a[x][y]);
  }

//遍历完两个方向后将结果v返回给上一层
  return v;
}

int main()
{
  cin >> t;
  while (t --)
  {
    /*
    因为某个坐标的花生数可能为0,因此要使用-1代表total[i][j]没有计算过从(i, j)开始能获得的最大花        生数量
    */
    memset(total, -1, sizeof total);
    cin >> r >> c;
    for (int i = 1; i <= r; i ++)
    for (int j = 1; j <= c; j ++)
    cin >> a[i][j];
    
    cout << dfs(1, 1) << endl;
  }
  
  return 0;
}

思路2

由于Hello Kitty只能向东或向南走,因此Hello Kitty到达某点坐标只能从西边或者北边来。那么我们可以将

  • 集合f(i, j)定义为:到达(i, j)的所有路径。
  • 属性:获得花生的最大数量。
  • 集合划分:从西边到达(i, j); 从北边到达(i, j)

        f(i, j) = a[i][j] + f(i, j - 1);
        f(i, j) = a[i][j] + f(i - 1, j);

代码2
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
//a存各坐标花生数;f[i][j]存到达(i, j)能获得的最大花生数量
int a[N][N], f[N][N];

int main()
{
  int t, r, c;
  cin >> t;
  
  while (t --)
  {
    //由于有多组不同的数据,因此每次都要重置为0
    memset(f, 0, sizeof f);
    cin >> r >> c;
    for (int i = 1; i <= r; i ++)
    for (int j = 1; j <= c; j ++)
    cin >> a[i][j];
    
    for (int i = 1; i <= r; i ++)
    {
      for (int j = 1; j <= c; j ++)
      {
        f[i][j] = max(f[i][j - 1], f[i - 1][j]) + a[i][j];
      }
    }
    
    cout << f[r][c] << endl;
  }
  return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1506039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【海贼王的数据航海:利用数据结构成为数据海洋的霸主】探究二叉树的奥秘

目录 1 -> 树的概念及结构 1.1 -> 树的概念 1.2 -> 树的相关概念 1.3 -> 树的表示 1.4 -> 树在实际中的运用(表示文件系统的目录树结构) 2 -> 二叉树概念及结构 2.1 -> 二叉树的概念 2.2 -> 现实中的二叉树 2.3 -> 特殊的二叉树 2.4 ->…

【软考】单元测试

目录 1. 概念2. 测试内容2.1 说明2.2 模块接口2.3 局部数据结构2.4 重要的执行路径 3. 测试过程2.1 说明2.2 单元测试环境图2.3 驱动模块2.4 桩模块 4. 模块接口测试与局部数据结构测试的区别 1. 概念 1.单元测试也称为模块测试&#xff0c;在模块编写完成且无编译错误后就可以…

数据库(mysql)-新手笔记(主外键,视图)

数据库基本知识点- http://t.csdnimg.cn/CVa9e 主外键 主键(唯一性,非空性) 主键是数据库表中的一个或多个字段&#xff0c;其值唯一标识表中的每一行/记录。 唯一性: 主键字段中的每个值都必须是唯一的&#xff0c;不能有两个或更多的记录具有相同的主键值 非空性&#x…

Ajax (1)

什么是Ajax&#xff1a; 浏览器与服务器进行数据通讯的技术&#xff0c;动态数据交互 axios库地址&#xff1a; <script src"https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script> 如何使用呢&#xff1f; 我们现有个感性的认识 <scr…

【Python-Docx库】Word与Python的完美结合

今天给大家分享Python处理Word的第三方库&#xff1a;Python-Docx。 什么是Python-Docx&#xff1f; Python-Docx是用于创建和更新Microsoft Word&#xff08;.docx&#xff09;文件的Python库。 日常需要经常处理Word文档&#xff0c;用Python的免费第三方包&#xff1a;Pyt…

【自制操作系统】系统启动流程,工具使用和启动区的制作

&#x1f4dd;本文介绍 本文主要从系统系统的启动流程开始&#xff0c;中间介绍一些所用工具的使用方法&#xff0c;最后将完成一个启动区的制作。此次的启动区只涉及到汇编代码。 &#x1f44b;作者简介&#xff1a;一个正在积极探索的本科生 &#x1f4f1;联系方式&#xff1…

《MySQL实战45讲》课程大纲

1MySQL实战45讲-01基础架构&#xff1a;一条SQL查询语句是如何执行的&#xff1f;2MySQL实战45讲-02日志系统&#xff1a;一条SQL更新语句是如何执行的&#xff1f;3MySQL实战45讲-03事务隔离&#xff1a;为什么你改了我还看不见&#xff1f;4MySQL实战45讲-04深入浅出索引&…

vue3 ref获取子组件显示 __v_skip : true 获取不到组件的方法 怎么回事怎么解决

看代码 问题出现了 当我想要获取这个组件上的方法时 为什么获取不到这个组件上的方法呢 原來&#xff1a; __v_skip: true 是 Vue 3 中的一个特殊属性&#xff0c;用于跳过某些组件的渲染。当一个组件被标记为 __v_skip: true 时&#xff0c;Vue 将不会对该组件进行渲染&am…

Springboot——JSR303校验

1. 请求参数的合法性校验 使用基于JSR303的校验框架实现&#xff0c;Springboot提供了JSR-303的支持&#xff0c;它就是spring-boot-starter-validation&#xff0c;他包括了很多的校验规则&#xff0c;只需要在模型中通过注解指定校验规则&#xff0c;在Controller方法上开启校…

map和set(二)——AVL树的简单实现

引入 二叉搜索树有其自身的缺陷&#xff0c;假如往树中 插入的元素有序或者接近有序&#xff0c;二叉搜索树就会退化成单支树&#xff0c;时间复杂度会退化成O(N)&#xff0c;因此 map、set等关联式容器的底层结构是对二叉树进行了平衡处理&#xff0c;即采用平衡树来实现。简…

深入了解二叉搜索树:原理、实现与应用

目录 一、介绍二叉搜索树 二、二叉搜索树的基本性质 三、二叉搜索树的实现 四、总结 在计算机科学中&#xff0c;数据结构是构建算法和程序的基础。其中&#xff0c;二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09;作为一种常见的数据结构&#…

从新手到高手:一站式 SQL Server 学习平台!

介绍&#xff1a;SQL Server是由微软公司开发的关系数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;自1989年推出以来&#xff0c;已成为全球主流的数据库之一。以下是对SQL Server的详细介绍&#xff1a; 易用性与可伸缩性&#xff1a;SQL Server以其易用性和良好的…

题目:泡澡(蓝桥OJ 3898)

问题描述&#xff1a; 解题思路&#xff1a; 图解&#xff1a;&#xff08;以题目样例为例子&#xff09; 注意点&#xff1a;题目的W是每分钟最大出水量&#xff0c;因此有一分钟的用水量大于出水量则不通过。 补充&#xff1a;差分一般用于对一段区间每个元素加相同值&#x…

arp 代理配置示例

一、应用场景&#xff1a; 当 R1 和 R3 配置静态路由下一跳为接口的时候&#xff0c;让 R2 充当 arp 代理&#xff0c;允许 R1、R3 互访 二、拓朴如下&#xff1a; 三、配置代码&#xff1a; [R1] ip route-static 10.1.23.0 255.255.255.0 GigabitEthernet0/0/0[R2] interf…

Git学习笔记(流程图+示例)

概念 图中左侧为工作区&#xff0c;右侧为版本库。Git 的版本库里存了很多东西&#xff0c;其中最重要的就是暂存区。 • 在创建 Git 版本库时&#xff0c;Git 会为我们自动创建一个唯一的 master 分支&#xff0c;以及指向 master 的一个指 针叫 HEAD。&#xff08;分支和HEAD…

服务器又被挖矿记录

写在前面 23年11月的时候我写过一篇记录服务器被挖矿的情况&#xff0c;点我查看。当时是在桌面看到了bash进程CPU占用异常发现了服务器被挖矿。 而过了几个月没想到又被攻击&#xff0c;这次比上次攻击手段要更高明点&#xff0c;在这记录下吧。 发现过程 服务器用的是4090…

【数据结构】详解时间复杂度和空间复杂度的计算

一、时间复杂度&#xff08;执行的次数&#xff09; 1.1时间复杂度的概念 1.2时间复杂度的表示方法 1.3算法复杂度的几种情况 1.4简单时间复杂度的计算 例一 例二 例三 1.5复杂时间复杂度的计算 例一&#xff1a;未优化冒泡排序时间复杂度 例二&#xff1a;经过优化…

Go语言必知必会100问题-19 浮点数溢出问题

问题呈现 在Go语言中&#xff0c;有两种浮点数类型&#xff08;虚数除外&#xff09;&#xff1a;float32和float64. 浮点数是用来解决整数不能表示小数的问题。我们需要知道浮点数算术运算是实数算术运算的近似&#xff0c;下面通过例子说明浮点数运算采用近似值的影响以及如…

LeetCode:143.重排链表

143. 重排链表 解题过程 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; …

python 蓝桥杯之并查集

文章目录 总述合并过程查找过程算法实战实战1 总述 并查集&#xff08;Disjoint-set Union&#xff0c;简称并查集&#xff09;是一种用来管理元素分组情况的数据结构。它主要用于解决集合的合并与查询问题&#xff0c;通常涉及到以下两种操作&#xff1a; 合并&#xff08;Uni…