hdu1159 poj1458 LCS裸题

HDU 1159

题意:找LCS

思路:裸题 n*m的写法,我的写法好像比较奇怪。。。用一个ci保存s2第i位可以做为s1的公共子序列的最大值,s1的每一位遍历s2,遍历的时候记录前面出现过的ci的最大值,ci一定是一个连序的上升序列,我的好像不是正经的LCS的算法,改天还是要学习一个的

AC代码:

#include "iostream"
#include "string.h"
#include "stack"
#include "queue"
#include "string"
#include "vector"
#include "set"
#include "map"
#include "algorithm"
#include "stdio.h"
#include "math.h"
#define ll long long
#define bug(x) cout<<x<<" "<<"UUUUU"<<endl;
#define mem(a) memset(a,0,sizeof(a))
#define mp(x,y) make_pair(x,y)
#define pb(x) push_back(x)
using namespace std;
const long long INF = 1e18+1LL;
const int inf = 1e9+1e8;
const int N=1e5+100;
const ll mod=1e9+7;

char s1[1005],s2[1005];
int dp[1005],c[1005],ans;
int main(){
    ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
    while(cin>>s1+1>>s2+1){
        ans=0,mem(dp),mem(c);
        int l1=strlen(s1+1), l2=strlen(s2+1);
        for(int i=1; i<=l1; ++i){
            int p=0;
            for(int j=1; j<=l2; ++j){
                int t=c[j];
                if(s1[i]==s2[j]){
                    dp[i]=max(dp[i],p+1);
                    c[j]=max(c[j],dp[i]);
                }
                if(t==p+1) p++;
            }
            ans=max(ans,dp[i]); //for(int j=1; j<=l2; ++j) cout<<c[j]<<" ";cout<<endl;
        }
        cout<<ans<<endl;
    }
    return 0;
}
时间: 2024-10-05 15:31:44

hdu1159 poj1458 LCS裸题的相关文章

解题报告:hdu1159 common consequence LCS裸题

2017-09-02 17:07:42 writer:pprp 通过这个题温习了一下刚学的LCS 代码如下: /* @theme:hdu1159 @writer:pprp @begin:17:01 @end:17:06 @declare:LCS的裸题,温习一下 @error:从1开始读入的话,用strlen也要从1开始测才可以 @date:2017/9/2 */ #include <bits/stdc++.h> using namespace std; char s1[1010],s2[101

hdu1159 LCS模板题

题目分析 原题地址 最简单的最长公共子序列(LCS)问题的模板题了.不解释. ------------------------------------------------------------------------ 状态转移方程: dp[i][j]=dp[i-1][j-1]+1                                 (a[i-1]==b[j-1]) dp[i][j]=max(dp[i-1][j],dp[i][j-1] )              (a[i-1]

SZOJ 167 Lca裸题

一道.......一道我改了一周的裸题 无根树建双向边 无根树建双向边 无根树建双向边 重要的事情说三遍(微笑) 还有要开longlong 还有双向边不是双倍边(微笑) 我真是,能把自己气吐血10次就不把自己气吐血9次 [问题描述] 已知一棵nn个点的树,点从1开始标号,树上每条边都有一个正整数边权. 有qq个询问,每个询问由type,u,vtype,u,v三个正整数构成. 当type=1type=1时,询问uu到vv路径上所有边权的二进制异或和. 当type=2type=2时,询问uu到vv路

HDU 4893 线段树裸题

Wow! Such Sequence! Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 2512    Accepted Submission(s): 751 Problem Description Recently, Doge got a funny birthday present from his new friend, Pro

POJ 3624 Charm Bracelet(01背包裸题)

Charm Bracelet Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 38909   Accepted: 16862 Description Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fill it with the best charms possible fro

HDOJ-1232 畅通工程【并查集裸题】

题目传送门 : http://acm.hdu.edu.cn/showproblem.php?pid=1232 并查集的裸题 AC code: #include <iostream> #define MAXN 1050 using namespace std; int pre[MAXN]; int Find(int pos) { int r = pos; while (r != pre[r]) r = pre[r]; int i = pos; while (i != r) { int t = p

【不可能的任务22/200】【填坑】bzoj3224 splay裸题

人生第一道splay不出所料是一道裸题,一道水题,一道2k代码都不到的题 1 #include <cstdio> 2 int root,N=0,n,p,q; 3 int fa[100001],c[100001][2],size[100001],sp[100001]; 4 void rot(int x) 5 { 6 int y=fa[x],k=(c[y][0]==x); 7 size[y]=size[c[y][k]]+size[c[x][k]]+1;size[x]=size[c[x][!k]]+

HDU 1102 最小生成树裸题,kruskal,prim

1.HDU  1102  Constructing Roads    最小生成树 2.总结: 题意:修路,裸题 (1)kruskal //kruskal #include<iostream> #include<cstring> #include<cmath> #include<queue> #include<algorithm> #include<cstdio> #define max(a,b) a>b?a:b using na

贴一下WC总结里提到的那道裸题吧。。。

[bzoj4034][HAOI2015]T2 试题描述 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子树中所有点的点权都增加 a . 操作 3 :询问某个节点 x 到根的路径中所有点的点权和. 输入 第一行包含两个整数 N, M .表示点数和操作数. 接下来一行 N 个整数,表示树中节点的初始权值. 接下来 N-1 行每行三个正整数 fr, to , 表示该树中存在一条边