训练营打卡Day57
思路
建立一个二维 dp 数组,并在 dp[i][j] 中存储以 text1[0…i-1] 和 text2[0…j-1] 结尾的最长公共子序列的长度。 递推关系式是如果 text1[i-1] == text2[j-1],那么 dp[i][j] = dp[i-1][j-1] + 1;否则 dp[i][j] = max(dp[i-1][j], dp[i][j-1])。 最终,dp[text1.size()][text2.size()] 的值就是最长公共子序列的长度。
代码
class Solution {
public :
int longestCommonSubsequence ( string text1, string text2) {
vector< vector< int > > dp ( text1. size ( ) + 1 , vector < int > ( text2. size ( ) + 1 , 0 ) ) ;
for ( int i = 1 ; i<= text1. size ( ) ; i++ )
for ( int j = 1 ; j<= text2. size ( ) ; j++ )
{
if ( text1[ i- 1 ] == text2[ j- 1 ] )
dp[ i] [ j] = dp[ i- 1 ] [ j- 1 ] + 1 ;
else
{
dp[ i] [ j] = max ( dp[ i- 1 ] [ j] , dp[ i] [ j- 1 ] ) ;
}
}
return dp[ text1. size ( ) ] [ text2. size ( ) ] ;
}
} ;
思路
它通过建立一个二维 dp 数组,并在 dp[i][j] 中存储在同时考虑 A 数组的前 i 个元素和 B 数组的前 j 个元素的情况下的最多不相交线段数量。 递推关系式是如果 A[i-1] == B[j-1],那么 dp[i][j] = dp[i-1][j-1] + 1;否则 dp[i][j] = max(dp[i-1][j], dp[i][j-1])。 最终,dp[A.size()][B.size()] 的值就是最多不相交线段数量。
代码
class Solution {
public :
int maxUncrossedLines ( vector< int > & A, vector< int > & B) {
vector< vector< int >> dp ( A. size ( ) + 1 , vector < int > ( B. size ( ) + 1 , 0 ) ) ;
for ( int i = 1 ; i <= A. size ( ) ; i++ ) {
for ( int j = 1 ; j <= B. size ( ) ; j++ ) {
if ( A[ i - 1 ] == B[ j - 1 ] ) {
dp[ i] [ j] = dp[ i - 1 ] [ j - 1 ] + 1 ;
} else {
dp[ i] [ j] = max ( dp[ i - 1 ] [ j] , dp[ i] [ j - 1 ] ) ;
}
}
}
return dp[ A. size ( ) ] [ B. size ( ) ] ;
}
} ;
题123:[53. 最大子数组和]https://leetcode.cn/problems/maximum-subarray/)
思路
使用变量 sum 记录当前的和,并通过 max(sum+num, num) 更新它,从而在枚举过程中维护当前的最大子序和。 最终,ans 记录的最大值就是整个序列的最大子序和。
代码
class Solution {
public :
int maxSubArray ( vector< int > & nums) {
int ans = INT32_MIN;
int sum = 0 ;
for ( const int & num: nums)
{
sum = max ( sum+ num, num) ;
ans = max ( sum, ans) ;
}
return ans;
}
} ;