HDU4545(最长公共子序列)

来源:互联网 发布:excel单元格重复数据 编辑:程序博客网 时间:2024/06/07 03:33

题目很明显了,最长公共子序列。但是构建映射的时候我用了multimap结果超时。。。。。

直接用hash就好,因为范围不大,就26个字母。

还有一点要吐槽的是我把两个串的索引写反了 竟然提醒我RE而不是WA 结果一道水题优化了一下午。

我真是去年买了个表

        #include<iostream>        #include<cstdio>        #include<algorithm>        #include<string.h>        using namespace std;        int dp[1005][1005];        bool Hash[130][130];                int main(){    int T;    scanf("%d",&T);    for(int Case=1;Case<=T;Case++)    {        memset(Hash,0,sizeof(Hash));        char strx[1005],strm[1005];        scanf("%s%s",strx,strm);    int m;    scanf("%d",&m);    for(int i=1;i<=m;i++)    {    char ch1[2],ch2[2];    scanf("%s%s",ch1,ch2);        Hash[ch1[0]][ch2[0]]=1;}int lenx=strlen(strx),lenm=strlen(strm);for(int i=0;i<lenx;i++){for(int j=0;j<lenm;j++){if(strx[i]==strm[j]||Hash[strm[j]][strx[i]]){dp[i][j]=i-1<0||j-1<0?1:dp[i-1][j-1]+1;}else{int x1=i-1<0?0:dp[i-1][j];int x2=j-1<0?0:dp[i][j-1];dp[i][j]=max(x1,x2);}}}if(dp[lenx-1][lenm-1]==lenx)    printf("Case #%d: happy\n",Case);else    printf("Case #%d: unhappy\n",Case);}}




原创粉丝点击