@ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)

@ 代码随想录算法训练营第8周(C语言)|Day57(动态规划)

Day53、动态规划(● 1143.最长公共子序列 ● 1035.不相交的线 ● 53. 最大子序和 动态规划 )

1143.最长公共子序列

题目描述

给定两个字符串 text1 和 text2,返回这两个字符串的最长公共子序列的长度。

一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。两个字符串的「公共子序列」是这两个字符串所共同拥有的子序列。

题目解答

c 复制代码
int longestCommonSubsequence(char* text1, char* text2) {
    int s1=strlen(text1);
    int s2=strlen(text2);
    int dp[s1+1][s2+1];
    memset(dp,0,sizeof(dp));
    for(int i=1;i<=s1;i++){
        for(int j=1;j<=s2;j++){
            if(text1[i-1]==text2[j-1]){
                dp[i][j]=dp[i-1][j-1]+1;
            }else{
                dp[i][j]=fmax(dp[i-1][j],dp[i][j-1]);
            }
        }
    }

    return dp[s1][s2];
}

题目总结

dpij:长度为0, i - 1的字符串text1与长度为0, j - 1的字符串text2的最长公共子序列为dpij

1035.不相交的线

题目描述

我们在两条独立的水平线上按给定的顺序写下 A 和 B 中的整数。

现在,我们可以绘制一些连接两个数字 Ai 和 Bj 的直线,只要 Ai == Bj,且我们绘制的直线不与任何其他连线(非水平线)相交。

以这种方法绘制线条,并返回我们可以绘制的最大连线数。

题目解答

c 复制代码
int maxUncrossedLines(int* nums1, int nums1Size, int* nums2, int nums2Size) {
    int dp[nums1Size+1][nums2Size+1];
    memset(dp,0,sizeof(dp));
    for(int i=1;i<nums1Size+1;i++){
        for(int j=1;j<nums2Size+1;j++){
            if(nums1[i-1]==nums2[j-1]){
                dp[i][j]=dp[i-1][j-1]+1;
            }else{
                dp[i][j]=fmax(dp[i-1][j],dp[i][j-1]);
            }
        }
    }
    return dp[nums1Size][nums2Size];
}

题目总结

与上题一致。

53. 最大子序和

题目描述

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

题目解答

c 复制代码
int max(int a,int b){
    return a>b?a:b;
}
int maxSubArray(int* nums, int numsSize) {
    int dp[numsSize];
    dp[0]=nums[0];
    int res=nums[0];
    for(int i=1;i<numsSize;i++){
        dp[i]=max(dp[i-1]+nums[i],nums[i]);
        res=max(res,dp[i]);
    }
    return res;
}

题目总结

dpi:包括下标i(以numsi为结尾)的最大连续子序列和为dpi。连续的就得包括结尾元素,不连续就不需要了。

相关推荐
大明者省5 小时前
WSL2 Ubuntu22.04 GPU训练环境配置指南
人工智能·算法·计算机视觉
WWJA王文举6 小时前
I²C通信完整流程详解:START、地址、ACK、数据、Repeated START和STOP一次讲透
c语言·开发语言
白狐_7987 小时前
408数据结构第8章:排序②——性质对比秒杀、场景选择与外部排序
java·数据结构·算法
zander2587 小时前
LeetCode 84:柱状图中的最大矩形——单调栈如何确定左右边界
java·数据结构·算法
Shell运维手记8 小时前
Linux 常用基础命令学习笔记
linux·运维·笔记·学习·算法·github
qq_448011168 小时前
C语言中的动态内存分配
c语言·开发语言·php
杨航 AI8 小时前
O(n log n):线性对数原理拆解 这个是排序算法的黄金复杂度之一。
算法·排序算法
船厂电气自动化ai大模型9 小时前
AI大模型与数学 第32课 函数凹凸性与二阶导数:拐点求解、凹凸区间计算(10道二阶导数计算题)
数据结构·人工智能·python·深度学习·算法
动词ing9 小时前
【学习笔记】C语言(数组指针与指针数组+字符数组+函数+参数传递+字符串作为形参+递归函数+指针函数+回调函数+结构体嵌套+内存动态分配函数)
c语言·笔记·学习
旖旎夜光9 小时前
LeetCode 3:无重复字符的最长子串(滑动窗口) —— 题解
数据结构·c++·算法·leetcode·滑动窗口