zoukankan      html  css  js  c++  java
  • HDU-1159 Common Subsequence

    链接http://acm.hdu.edu.cn/showproblem.php?pid=1159

    题意:多组输入,每组两个字符串,求最长公共子序列(LCS)的长度

    思路:裸题,套板子。dp[i][j]表示a串以i结尾,b串以j结尾的范围中,LCS的长度,如果a[i]=b[j],那么dp[i][j]=dp[i-1][j-1]+1,不然就从dp[i-1][j]和dp[i][j-1]里挑一个最大的,遍历i和j跑一遍最后输出dp[n][m]就好了

    代码

     1 #include<bits/stdc++.h>
     2 // #include<iostream>
     3 // #include<cstdio>
     4 // #include<cmath>
     5 #define inf 0x3f3f3f3f
     6 using namespace std;
     7 
     8 typedef long long ll;
     9 typedef long double ld;
    10 
    11 const int M = int(1e5)*3 + 5;
    12 const int mod = 10056;
    13 
    14 inline int lowbit(int x) {
    15     return x & (-x);
    16 }
    17 
    18 // string a,b;
    19 char a[M],b[M];
    20 int dp[1005][1005];
    21 int main(){
    22     while(~scanf("%s%s",a+1,b+1)){
    23         memset(dp,0,sizeof(dp));
    24     
    25         int n=strlen(a+1);
    26         int m=strlen(b+1);
    27         
    28         for(int i=1;i<=n;i++){
    29             for(int j=1;j<=m;j++){
    30                 if(a[i]==b[j]){
    31                     dp[i][j]=max(dp[i][j],dp[i-1][j-1]+1);
    32                 }
    33                 else{
    34                     dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
    35                 }
    36             }
    37         }
    38         
    39         cout<<dp[n][m]<<endl;
    40     }
    41     // scanf("%s",a+1);
    42     // int n=strlen(a+1);
    43     // printf("%d",n);
    44     return 0;
    45 }

    备注:想用string写,但是边界问题处理不好,有没有大神能用string写一下的

  • 相关阅读:
    CSS 字体
    列表排列
    IE6 fixed 页面抖动
    HTML中css和js链接中的版本号(刷新缓存)
    CSS3 box-shadow
    CSS3的文字阴影—text-shadow
    [LeetCode][JavaScript]Add Digits
    [LeetCode][JavaScript]Max Points on a Line
    [LeetCode][JavaScript]Subsets II
    [LeetCode][JavaScript]Subsets
  • 原文地址:https://www.cnblogs.com/harutomimori/p/11287399.html
Copyright © 2011-2022 走看看