Java解题--练习解题阶段(无序阶段)-ALGO-1006 拿金币

文章描述了一种通过动态规划策略解决从矩阵左上角到右下角获取最多金币的问题。初始方法存在错误,后来通过累加每个位置可能的最大值并扩展边界得到正确答案。代码示例展示了两种方法,第二种使用动态规划避免了路径选择错误。
摘要由CSDN通过智能技术生成

题目

算法训练 拿金币

资源限制

内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s

问题描述

  有一个N x N的方格,每一个格子都有一些金币,只要站在格子里就能拿到里面的金币。你站在最左上角的格子里,每次可以从一个格子走到它右边或下边的格子里。请问如何走才能拿到最多的金币。

输入格式

  第一行输入一个正整数n。

  以下n行描述该方格。金币数保证是不超过1000的正整数。

输出格式

  最多能拿金币数量。

样例输入

3

1 3 3

2 2 2

3 1 2

样例输出

11

数据规模和约定

  n<=1000

解题思路

刚开始是考虑,每一步考虑当前情况,两个方向的最大值,,永远向最大值走,通过计数累加金币数

但儒道如下类似状况,会出现错误,因为她路径前面的数字小,所有会错过,

后来根据是扫雷的启发,在每一个位置上累加出来他可能的最大值,

并且扩展边界来保证下标不越界,实际上也符合规律

求每个位置上,是加左边的大还是加上面的大,

然后再当前位置上累加,就代表做到这个位置上最大可以有多少金币

这种方法就是没有明确的坐标,没有明确的位置,对于最初的想法来说

因为我们会遍历每一个坐标,所有不会遗漏,

因为规定只能向右向下,所有我们的遍历方法,再每一个位置他的左边和上边都是已经固定的,

所有可以正确执行输出

代码实现

方法一别看了,是最开始的错误写法,下面的是正解

package 蓝桥解题集;

import java.text.Format;
import java.util.Date;
import java.util.Scanner;

public class ALOG1006拿金币 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner sc = new Scanner(System.in);
//        int n = 3;
//        int[][] arr = {
//                {1,3,3},
//                {2,2,2},
//                {9,1,2},
//        } ;
        int n = sc.nextInt();
        int[][] arr = new int[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                arr[i][j] = sc.nextInt();
            }
        }
        ///
        int count = 1;
        int x =0,y =0;
        for (int i = 0; i < (2*n)-1; i++) {

            if (x+1>n-1) {

                x--;
                y++;
                if (y+1>n-1) {
                    if (x+1==n-1&&y+1==n) {
                        //到达最有或者最下
                        //只能往一个方向走
                        x++;
                        System.out.println("向右");
                        count+=arr[x][y];
                        if (x==n-1) {
                            break;
                        }

                    }
                    y--;
                }
            }
            if (y+1>n-1) {

                y--;
                x++;
                if (x+1>n-1) {
                    if (x+1==n&&y+1==n-1) {
                        //到达最有或者最下
                        //只能往一个方向走
                        y++;
                        System.out.println("向下");
                        count+=arr[x][y];
                        if (y==n-1) {
                            break;
                        }

                    }
                    x--;
                }
            }
            if (arr[x+1][y]>arr[x][y+1]) {
                x++;
                System.out.println(arr[x][y]+":"+x+":"+y);
                count += arr[x][y];

            }else {
                y++;
                System.out.println(arr[x][y]+":"+x+":"+y);
                count += arr[x][y];                
            }

        }
        //
        System.out.println(count);

    }



}

方法二

3

1 3 3

2 2 2

9 1 3

///使用的 自己的测试,因为题目测试样例,即使方法一也嫩正确,这个样例可以屏蔽掉部分蒙对的情况,

package 蓝桥解题集;


import java.io.*;
import java.util.LinkedList;
import java.util.Scanner;


public class ALOG1006拿金币_3 {
    public static void main (String[]args)throws IOException {

        Scanner in = new Scanner(System.in);
        int n = in.nextInt();    
        int[][] dp = new int[n+1][n+1];
        for (int i = 1; i <=n ; i++) {
            for (int j = 1; j <=n ; j++) {
                int m = in.nextInt();    
                dp[i][j]=m;
            }
        }
        
        
        for (int i = 1; i <=n ; i++) {
            for (int j = 1; j <=n ; j++) {
                int up = dp[i-1][j];
                int left = dp[i][j-1];
                if (up>left) {
                    dp[i][j] += up;
                }else {
                    dp[i][j] += left;
                }
            }
        }

        

        System.out.println(dp[n][n]);        
    }


}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
ICM-42670-P芯片中的算法Algorithm)例程代码是一段用于演示ICM-42670-P芯片在实际应用中如何使用的示例代码。该代码主要包括以下几个模块: 1. 初始化模块 该模块主要用于初始化ICM-42670-P芯片,包括设置SPI或I2C接口、配置滤波器和测量范围等参数。具体代码如下: ``` void icm42670p_algo_init(void) { /* Initialize ICM-42670-P */ icm42670p_init(); /* Set accelerometer range to +/- 8g */ icm42670p_set_acc_range(ICM42670_ACC_RANGE_8G); /* Set gyroscope range to +/- 2000dps */ icm42670p_set_gyro_range(ICM42670_GYRO_RANGE_2000DPS); /* Enable low pass filter for accelerometer and gyroscope */ icm42670p_enable_acc_lpf(ICM42670_ACC_LPF_21HZ); icm42670p_enable_gyro_lpf(ICM42670_GYRO_LPF_21HZ); } ``` 该函数首先调用了icm42670p_init()函数,初始化ICM-42670-P芯片,然后设置了加速度计和陀螺仪的测量范围,以及启用低通滤波器。 2. 数据读取模块 该模块用于读取ICM-42670-P芯片中加速度计和陀螺仪的原始数据,并进行单位转换。具体代码如下: ``` void icm42670p_algo_read_data(float *ax, float *ay, float *az, float *gx, float *gy, float *gz) { int16_t raw_ax, raw_ay, raw_az, raw_gx, raw_gy, raw_gz; /* Read accelerometer and gyroscope data */ raw_ax = icm42670p_read_acc_x(); raw_ay = icm42670p_read_acc_y(); raw_az = icm42670p_read_acc_z(); raw_gx = icm42670p_read_gyro_x(); raw_gy = icm42670p_read_gyro_y(); raw_gz = icm42670p_read_gyro_z(); /* Convert raw data to physical units */ *ax = raw_ax * ICM42670_ACC_SENSITIVITY / 1000.0; *ay = raw_ay * ICM42670_ACC_SENSITIVITY / 1000.0; *az = raw_az * ICM42670_ACC_SENSITIVITY / 1000.0; *gx = raw_gx * ICM42670_GYRO_SENSITIVITY / 1000.0; *gy = raw_gy * ICM42670_GYRO_SENSITIVITY / 1000.0; *gz = raw_gz * ICM42670_GYRO_SENSITIVITY / 1000.0; } ``` 该函数首先调用icm42670p_read_acc_x()等函数读取加速度计和陀螺仪的原始数据,然后将其转换为物理单位(重力加速度和弧度/秒)。 3. 姿态解算模块 该模块主要用于计算物体在X、Y、Z三个轴上的倾斜角度。具体代码如下: ``` void icm42670p_algo_calc_angles(float ax, float ay, float az, float gx, float gy, float gz, float *roll, float *pitch, float *yaw) { float roll_rad, pitch_rad, yaw_rad; /* Calculate roll, pitch and yaw angles */ roll_rad = atan2(ay, az); pitch_rad = atan2(-ax, sqrt(ay*ay + az*az)); yaw_rad = atan2(gx, sqrt(gy*gy + gz*gz)); /* Convert angles to degrees */ *roll = roll_rad * 180 / PI; *pitch = pitch_rad * 180 / PI; *yaw = yaw_rad * 180 / PI; } ``` 该函数使用了三个公式,将原始数据转换为倾斜角度,并进行单位转换。 4. 主函数模块 主函数模块中调用了上述三个模块,实现了ICM-42670-P芯片的数据读取和姿态解算。具体代码如下: ``` int main(void) { float ax, ay, az, gx, gy, gz; float roll, pitch, yaw; /* Initialize algorithm */ icm42670p_algo_init(); while (1) { /* Read data from ICM-42670-P */ icm42670p_algo_read_data(&ax, &ay, &az, &gx, &gy, &gz); /* Calculate roll, pitch and yaw angles */ icm42670p_algo_calc_angles(ax, ay, az, gx, gy, gz, &roll, &pitch, &yaw); /* Output results */ printf("roll=%.2f, pitch=%.2f, yaw=%.2f\n", roll, pitch, yaw); } return 0; } ``` 该函数使用了一个while循环,不断读取ICM-42670-P芯片中的数据,并计算出倾斜角度,最后将结果输出到终端或其他外设上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CLODVEP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值