day33--62.不同路径+ 63. 不同路径 II +343. 整数拆分

一、62.不同路径

题目链接:https://leetcode.cn/problems/unique-paths/
文章讲解:https://programmercarl.com/0062.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84.html
视频讲解:https://www.bilibili.com/video/BV1ve4y1x7Eu/
1.1 初见思路

  1. 动规五部曲
  2. dp数组的定义:从左上角坐标为(0,0) ,dp[i][j]表示到达向右移动了i步,向下移动了j步的位置,的路径数量
  3. 确定转移方程:dp[i][j]=dp[i-1][j]+dp[i][j-1];
  4. 确定初始化:dp[i][0]一定都是1,dp[0][j]同理
  5. 确定遍历顺序
  6. 举例推导dp数组

1.2 具体实现

class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m][n];
        dp[0][0]=1;
        for(int i=0;i<m;i++){
            for(int j=0;j<n;j++){
                if(i==0 || j==0){
                    dp[i][j]=1;
                    continue;
                }
                else{
                    dp[i][j]=dp[i-1][j]+dp[i][j-1];
                }
            }
        }
        return dp[m-1][n-1];
    }
}

1.3 重难点

二、 63. 不同路径 II

题目链接:https://leetcode.cn/problems/unique-paths-ii/
文章讲解:https://programmercarl.com/0063.%E4%B8%8D%E5%90%8C%E8%B7%AF%E5%BE%84II.html
视频讲解:https://www.bilibili.com/video/BV1Ld4y1k7c6/
2.1 初见思路

  1. 相对于上一题增加了中间的障碍物,应该没有太大区别,继续用动规五部曲来分析
  2. 确定dp[i,j]含义:左上角位(0,0)到达(i-1,j-1)坐标点有dp[i,j]条路径
  3. 确认转移方程:dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
    但是要注意的是,遇到障碍物时dp[i][j]=0;
  4. 确定初始化:dp[i][0]和dp[0][j]都是1,但是要注意,边路上有障碍的情况,不能把dp[i][0]和dp[0][j]都赋值为1,如果边路有障碍,那么障碍之后的边路应该都为0
  5. 确定顺序:
  6. 模拟
  7. 注意不要像上一题的写法,把赋予初始值跟计算路径数耦合在一起,这样写这道题很难写;
    要把初始化和计算分开来。

2.2 具体实现

class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int n = obstacleGrid[0].length;
        int m = obstacleGrid.length;
        int[][] dp = new int[m][n];
        dp[0][0] = 1;

         if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) {
            return 0;
        }
        //初始化
        for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) {
            dp[i][0] = 1;
        }
        for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) {
            dp[0][j] = 1;
        }

        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] = (obstacleGrid[i][j] == 0) ? dp[i - 1][j] + dp[i][j - 1] : 0;
            }
        }
        return dp[m - 1][n - 1];
    }
}

2.3 重难点

三、343. 整数拆分

题目链接:https://leetcode.cn/problems/integer-break/description/
文章讲解:https://programmercarl.com/0343.%E6%95%B4%E6%95%B0%E6%8B%86%E5%88%86.html
视频讲解:https://www.bilibili.com/video/BV1Mg411q7YJ/

3.1 初见思路

  1. 看到题目中的“乘积最大化”,就应该想想是否要用动态规划
  2. 动规五部曲
  3. 确定dp[i]的含义:dp[i]表示就是将数字拆成 数字i 时的最大乘积
  4. 确定传递方程:dp[i] = max(dp[i], max((i - j) * j, dp[i - j] * j))
    不确定拆分的个数,怎么写这个方程?
    j * (i - j) 是单纯的把整数拆分为两个数相乘,而j * dp[i - j]是拆分成两个以及两个以上的个数相乘
  5. 初始化:dp[2]=1,之前的无意义
  6. 确定方向:从前向后遍历
  7. 模拟

3.2 具体实现

class Solution {
    public int integerBreak(int n) {
        int[] dp = new int[n + 1];
        dp[2] = 1;
        for (int i = 3; i <= n; i++) {
            for (int j = 1; j <= i - j; j++) {
                // 这里的 j 其实最大值为 i-j,再大只不过是重复而已,
                // 并且,在本题中,我们分析 dp[0], dp[1]都是无意义的,
                // j 最大到 i-j,就不会用到 dp[0]与dp[1]
                dp[i] = Math.max(dp[i], Math.max(j * (i - j), j * dp[i - j]));
                // j * (i - j) 是单纯的把整数 i 拆分为两个数 也就是 i,i-j ,再相乘
                // 而j * dp[i - j]是将 i 拆分成两个以及两个以上的个数,再相乘。
            }
        }
        return dp[n];
    }
}

3.3 重难点

  • 确定传递方程是这题最难的地方

在这里插入图片描述

  • 17
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
根据星历计算卫星位置的方法是比较复杂的,需要用到天文学中的一些计算方法和公式,因此需要一些较为复杂的计算。以下是一个大致的计算流程: 1. 将给定的日期时间转换为儒略日(Julian day)。 2. 根据儒略日计算相应的世纪数。 3. 计算卫星的平近点角(Mean Anomaly)和升交点赤经(Right Ascension of Ascending Node)。 4. 计算卫星的轨道倾角(Inclination)、近地点角距(Argument of Perigee)、半长轴(Semi-Major Axis)等轨道参数。 5. 计算卫星的真近点角(True Anomaly)。 6. 根据卫星的真近点角、轨道参数和世纪数等信息,计算卫星的位置。 下面是一个简单的 C++ 代码示例,可以用来计算给定日期时间的 C01 卫星位置: ```c++ #include <iostream> #include <cmath> using namespace std; const double PI = 3.14159265358979323846; const double GM = 3.986005e14; const double OMEGA_E = 7.2921151467e-5; const double MU_GPS = 3.986005e14; const double C_GPS = 299792458.0; // 计算儒略日 double julian_day(int year, int month, int day, int hour, int minute, int second) { int a = (14 - month) / 12; int y = year + 4800 - a; int m = month + 12 * a - 3; int jdn = day + (153 * m + 2) / 5 + 365 * y + y / 4 - y / 100 + y / 400 - 32045; double jd = jdn + ((double)hour - 12) / 24 + (double)minute / 1440 + (double)second / 86400; return jd; } // 计算卫星位置 void satellite_position(double t, double *pos) { // 从星历中读取轨道参数等信息 double a = 26559700.0; double e = 0.008777161321; double i = 0.9757632172; double O = 0.5405171530; double w = 3.510029399; double M = 0.0; double n = sqrt(MU_GPS / pow(a, 3)); double t0 = 0.0; // 计算平近点角 double E = M + e * sin(M); double E0 = E; while (abs(E - E0) > 1e-12) { E0 = E; E = M + e * sin(E); } double v = 2 * atan(sqrt((1 + e) / (1 - e)) * tan(E / 2)); double r = a * (1 - e * cos(E)); // 计算卫星位置 double x = r * (cos(O) * cos(w + v) - sin(O) * sin(w + v) * cos(i)); double y = r * (sin(O) * cos(w + v) + cos(O) * sin(w + v) * cos(i)); double z = r * sin(w + v) * sin(i); double dt = t - t0; pos[0] = x * cos(OMEGA_E * dt) + y * sin(OMEGA_E * dt); pos[1] = -x * sin(OMEGA_E * dt) + y * cos(OMEGA_E * dt); pos[2] = z; } int main() { int year = 2020; int month = 12; int day = 23; int hour = 23; int minute = 0; int second = 0; double jd = julian_day(year, month, day, hour, minute, second); double t = (jd - 2451545.0) / 36525.0; double pos[3]; satellite_position(t, pos); cout << "C01卫星位置:" << endl; cout << "X = " << pos[0] << " m" << endl; cout << "Y = " << pos[1] << " m" << endl; cout << "Z = " << pos[2] << " m" << endl; return 0; } ``` 注意:由于卫星位置的计算涉及很多天文学中的参数和公式,因此以上代码仅供参考,具体实现需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值