DP 动态规划 Problem B 1002 求最长上升子序列的长度

Problem B  ID:1002

简单题意:给出X和Z两个字符串,求最长上升子序列的长度。

解题思路形成过程:利用矩阵。X字符串中的各字符依次作为行标,Z字符串中的各字符依次作为列标。

从第一行第一列开始逐行遍历:如果当前位置对应的两个字符相同,则在这个位置记录"前一行前一列"的对应的数+1;

如果当前位置对应的两个字符不同,则在这个位置记录"此行前一列"和"此列前一行"对应的两个数的最大值。

遍历结束后,最后一行最后一列获得的数便是最长上升子序列的长度。

(遍历到的每一个点代表此点对应的x、z字符为最后一个字符时最长上升子序列的长度)

感想:自己想了好一会儿,但是只想出了暴力的方法,没有想出用DP解决的方案。只得去网上找了相关算法。

将两行的字符问题转化为用矩阵的方式进行解决真的太惊艳、迷人了。

感觉此问题的解决方式就像是一种继承,所有的情况用矩阵的方式都考虑到,每遍历到一个点,分情况对之前的结果进行继承,遍历到最后也就自然求出目标解。

代码:

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <cstring>
#define cmax(a,b) (a)>(b)?(a):(b)     //max()函数在库中没有,须自己定义!
using namespace std;
char a[1001],b[1001];
int cmap[1001][1001];
void dp()
{
    for(int i=1;i<=strlen(a);++i)
        for(int j=1;j<=strlen(b);++j){
            if(a[i-1]==b[j-1])
                cmap[i][j]=cmap[i-1][j-1]+1;
            else
                cmap[i][j]=cmax(cmap[i-1][j],cmap[i][j-1]);
        }
}
int main()
{
    //freopen("1.txt","r",stdin);
    while(scanf("%s %s",a,b)!=EOF)  //写成&a,&b是错误的!
    {
        memset(cmap,0,sizeof(cmap));
        dp();
        int t=cmap[strlen(a)][strlen(b)];
        printf("%d\n",t);
    }
}

时间: 2024-08-28 10:08:20

DP 动态规划 Problem B 1002 求最长上升子序列的长度的相关文章

(hdu step 3.2.2)Common Subsequence(简单dp:求最长公共子序列的长度)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: Common Subsequence Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 976 Accepted Submission(s): 538   Probl

HDU4604.Deque——nlogn求最长上升子序列的长度

http://acm.hdu.edu.cn/showproblem.php?pid=4604 把一个序列中的元素放到队列里面,有3种操作,对于第i个元素 1.放到队头2.放到队尾3.舍弃 求最长上升序列的长度 法1:求出每个以a[i]为起点的最长不升子序列的长度,和最长不降子序列的长度,两个相加再减去a[i]重复的次数 法2:把当前序列复制两个,一个逆序,求总共的最长上升子序列的长度,然后奇偶避免重复 //法1 #include <iostream> #include <cstring&

求最长公共子序列的长度

1 #include <cstdio> 2 #include <iostream> 3 4 using namespace std; 5 6 const int max_n = 1000 + 2; 7 const int max_a = 1e6 + 10; 8 9 int n; 10 int a[max_n]; 11 int dp[max_n]; 12 13 void solve() 14 { 15 for(int i=1;i<=n;++i) 16 { 17 dp[i]=1;

(hdu step 3.2.3)Super Jumping! Jumping! Jumping!(DP:求最长上升子序列的最大和)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: Super Jumping! Jumping! Jumping! Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 896 Accepted Submission(s

HDU 1243 反恐训练营 (动态规划求最长公共子序列)

反恐训练营 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3040    Accepted Submission(s): 693 Problem Description 当今国际反恐形势很严峻,特别是美国"9.11事件"以后,国际恐怖势力更是有恃无恐,制造了多起骇人听闻的恐怖事件.基于此,各国都十分担心恐怖势力会对本国社会造

hdu 4352 数位dp(最长上升子序列的长度为k的个数)

http://acm.hdu.edu.cn/showproblem.php?pid=4352 Problem Description #define xhxj (Xin Hang senior sister(学姐)) If you do not know xhxj, then carefully reading the entire description is very important. As the strongest fighting force in UESTC, xhxj grew

(hdu step 3.2.4)FatMouse&#39;s Speed(在第一关键字升序的情况下,根据第二关键字来求最长下降子序列)

在写题解之前给自己打一下广告哈~..抱歉了,希望大家多多支持我在CSDN的视频课程,地址如下: http://edu.csdn.net/course/detail/209 题目: FatMouse's Speed Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 1034 Accepted Submission(s): 526   Proble

nlogn 求最长上升子序列 LIS

最近在做单调队列,发现了最长上升子序列O(nlogn)的求法也有利用单调队列的思想. 最长递增子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i<j,必有a[i]<a[j],这样最长的子序列称为最长递增子序列. 设dp[i]表示以i为结尾的最长递增子序列的长度,则状态转移方程为: dp[i] = max{dp[j]+1}, 1<=j<i,a[j]<a[i]. 这样简单的复杂度为O(n^2),其实还有更好的方法. 考虑两个数a[x]和a[y],x&

动态规划求解最长递增子序列的长度

一,问题描述 给定一个序列,求解它的最长 递增 子序列 的长度.比如: arr[] = {3,1,4,1,5,9,2,6,5}   的最长递增子序列长度为4.即为:1,4,5,9 二,算法分析 有两种方式来求解,一种是转化为LCS问题.即,首先对数组排序,将排序后的结果存储在辅助数组中.排序时间复杂度O(NlogN),排序后的数组与原数组组成了LCS(N,N)问题.解决LCS问题的时间复杂度为O(N^2),故整个算法的时间复杂度为O(N^2),空间复杂度为O(N) 另一种方式是直接用DP求解,算