zoukankan      html  css  js  c++  java
  • 动态规划 | 保留重复元素的LCS 1045

    这题也可以用LIS求解。LIS解题报告:动态规划 | 对输入进行hash处理的LIS 1045

    普通LCS是必须完全匹配的,所以状态转移方程式(末端匹配到时):dp[i][j]=dp[i-1][j-1]+1

    但是本题连续的序列是可以累加的。所以状态状态转移方程式(末端匹配到时):dp[i][j]=max{dp[i-1][j],dp[i][j-1]}+1

    A、B两个序列,让他们从无到有依次增长(二重循环),当A、B的末端能匹配时,有两个状态:①A不变,B的上一个状态 ①B不变,A的上一个状态 

    两个状态的最大值+1就是dp[i][j]的值

    AC代码:

    #include <stdio.h>
    #include <memory.h>
    #include <math.h>
    #include <string>
    #include <vector>
    #include <set>
    #include <stack>
    #include <queue>
    #include <algorithm>
    #include <map>
    
    
    #define I scanf
    #define OL puts
    #define O printf
    #define F(a,b,c) for(a=b;a<c;a++)
    #define FF(a,b) for(a=0;a<b;a++)
    #define FG(a,b) for(a=b-1;a>=0;a--)
    #define LEN 10010
    #define MAX (1<<30)-1
    #define V vector<int>
    
    using namespace std;
    
    int A[210];
    int B[10010];    
    int dp[210][10010];
    
    int main(){
    //    freopen("1045.txt","r",stdin);
        int i,N,M,L,j;
        I("%d",&N);
        I("%d",&M);
        F(i,1,M+1) I("%d",&A[i]);
        I("%d",&L);
        F(i,1,L+1) I("%d",&B[i]);
        F(i,1,M+1){
            F(j,1,L+1){
                if(A[i]==B[j]){
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1])+1;
                }else{
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        O("%d
    ",dp[M][L]);
        return 0;
    }
  • 相关阅读:
    数据算法之汉诺塔
    Mvc模板页
    mvc局部视图
    Area区域
    mvc之文件下载
    MVC过滤器
    MVC_Ajax请求
    MVC之校验
    Json&Razor&控制器
    抓包分析,tcpdump 和 wireshark 配合使用的简单尝试
  • 原文地址:https://www.cnblogs.com/TQCAI/p/8570153.html
Copyright © 2011-2022 走看看