zoukankan      html  css  js  c++  java
  • UVa 10100

    题目:求两组字符串中最大的按顺序出现的同样单词数目。

    分析:dp。最大公共子序列(LCS)。

    把单词整个看成一个元素比較就可以。

                状态:f(i,j)为s1串前i个单词与s2串前j个单词的最大匹配数;

                转移:f(i,j)= max(f(i-1,j),f(i。j-1)){ s1[i] ≠ s2[j] };

                                               f(i-1,j-1)+ 1。

                这里的字母包含数字

    说明:数据输入。须要先分解成单词,然后计算就可以。

    #include <iostream>
    #include <cstdlib>
    #include <cstring>
    #include <cstdio>
    
    using namespace std;
    
    char buf[1001]; 
    char s1[1001][22];
    char s2[1001][22];
    
    int  f[1001][1001];
    
    int letter(char c)
    {
    	if (c >= 'a' && c <= 'z')
    		return 1;
    	if (c >= 'A' && c <= 'Z')
    		return 1;
    	if (c >= '0' && c <= '9') 
    		return 1;
    	return 0;
    }
    
    int getword(char s[][22], char *t)
    {
    	int move = 0,count = 0;
    	while (t[move]) {
    		while (t[move] && !letter(t[move])) 
    			move ++;
    		if (!t[move]) break;
    		int now = move;
    		while (letter(t[move])) 
    			move ++;
    		int save = 0;
    		while (now < move) 
    			s[count][save ++] = t[now ++];
    		s[count][save] = 0;
    		count ++;
    	}
    	return count;
    }
    
    int main()
    {
    	int blank = 0,l1,l2,cases = 1;
    	while (gets(buf)) {
    		if (!strlen(buf)) blank = 1;
    		l1 = getword(s1, buf);
    		gets(buf);
    		if (!strlen(buf)) blank = 1;
    		l2 = getword(s2, buf);
    		
    		printf("%2d. ",cases ++);
    		if (blank) {
    			printf("Blank!
    ");
    			blank = 0;
    		}else {
    			for (int i = 0 ; i <= l1 ; ++ i)
    			for (int j = 0 ; j <= l2 ; ++ j)
    				f[i][j] = 0;
    			for (int i = 1 ; i <= l1 ; ++ i)
    			for (int j = 1 ; j <= l2 ; ++ j) {
    				f[i][j] = f[i-1][j];
    				if (f[i][j] < f[i][j-1])
    					f[i][j] = f[i][j-1];
    				if (!strcmp(s1[i-1], s2[j-1]))
    					f[i][j] = f[i-1][j-1]+1;
    			}	
    			printf("Length of longest match: %d
    ",f[l1][l2]);
    		}
    	}
    	
    	return 0;
    }
    

  • 相关阅读:
    iOS SDK:预览和打开文档
    显示手机内联系人数量
    已知一点的经纬度和该点到另一点的距离,求另一点的经纬度
    坚持让自己的每次尝试都做到极限
    2016第52周一时间的朋友读书会
    2016年第51周日三岁看大?
    2016第51周五产品经理的十大错误
    2016第51周四外甥女走丢记
    2016第51周三产品经理如何更有说服力
    2016第51周二
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/6723162.html
Copyright © 2011-2022 走看看