目录
300.最长递增子序列(再看看)
题目链接:300. 最长递增子序列
dp[i]表示以i结尾的最长递增子序列的长度。
int lengthOfLIS(int* nums, int numsSize){
int* dp=(int*)malloc(sizeof(int)*numsSize);
dp[0]=1;
int ret=1;
for(int i=1;i<numsSize;i++){
dp[i]=1;
for(int j=0;j<i;j++){
if(nums[j]<nums[i]){
dp[i]=fmax(dp[i],dp[j]+1);
}
}
ret=fmax(ret,dp[i]);
}
return ret;
}
674. 最长连续递增序列(简单)
题目链接:674. 最长连续递增序列
这个题很好想!
int findLengthOfLCIS(int* nums, int numsSize){
int* dp=(int*)malloc(sizeof(int)*numsSize);
dp[0]=1;
int ret=1;
for(int i=1;i<numsSize;i++){
dp[i]=1;
if(nums[i]>nums[i-1]){
dp[i]=dp[i-1]+1;
}
ret=fmax(ret,dp[i]);
}
return ret;
}
718. 最长重复子数组
题目链接:718. 最长重复子数组
下面代码,也就是dp[i][j]表示nums1中下标i处与nums2中下标j处最长重复子序列的长度,代码较为冗长。
int findLength(int* nums1, int nums1Size, int* nums2, int nums2Size){
int dp[nums1Size][nums2Size];
int ret=0;
//初始化j=0
for(int i=0;i<nums1Size;i++){
if(nums1[i]==nums2[0]){
dp[i][0]=1;
ret=1;
}else{
dp[i][0]=0;
}
}
//初始化i=0
for(int j=0;j<nums2Size;j++){
if(nums2[j]==nums1[0]){
dp[0][j]=1;
ret=1;
}else{
dp[0][j]=0;
}
}
for(int i=1;i<nums1Size;i++){
for(int j=1;j<nums2Size;j++){
if(nums1[i]==nums2[j]){
dp[i][j]=dp[i-1][j-1]+1;
}else{
dp[i][j]=0;
}
ret=fmax(ret,dp[i][j]);
}
}
return ret;
}
因此,换为:dp[i][j]表示nums1中下标i-1处与nums2中下标j-1处最长重复子序列的长度,代码如下:
int findLength(int* nums1, int nums1Size, int* nums2, int nums2Size){
int dp[nums1Size+1][nums2Size+1];
int ret=0;
//初始化j=0
for(int i=0;i<=nums1Size;i++){
dp[i][0]=0;
}
//初始化i=0
for(int j=0;j<=nums2Size;j++){
dp[0][j]=0;
}
for(int i=1;i<=nums1Size;i++){
for(int j=1;j<=nums2Size;j++){
if(nums1[i-1]==nums2[j-1]){
dp[i][j]=dp[i-1][j-1]+1;
}else{
dp[i][j]=0;
}
ret=fmax(ret,dp[i][j]);
}
}
return ret;
}