HDU4545(最长公共子序列)

题目很明显了,最长公共子序列。但是构建映射的时候我用了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);		
		}
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值