user-0 提问: 菜鸟求助一个经典的动态规划题

回复:
user: user-1
content: 还不给注册……

user: user-2
content: #include "stdafx.h" #include<string.h> #include<stdlib.h> void lower(char *a) { 	for (int i = 0; a[i] != '\0'; i++) { 		if (a[i] >= 'A' && a[i] <= 'Z') { 			a[i] = a[i] - 'A' + 'a'; 		} 	} } int max(int a, int b) { 	return (a > b ?  a : b); }  int main() { 	char a[100] = "aaa", b[100] = "abb"; 	int dp[100][100]; 	//scanf("%s%s", a, b); 	lower(a); 	lower(b); 	for (int i = 1; a[i - 1] != '\0'; i++)  		for (int j = 1; b[j - 1] != '\0'; j++) { 			dp[i - 1][j-1] = 0; 		}  	for (int i = 1; a[i-1] != '\0'; i++) {		 		for (int j = 1; b[j-1] != '\0'; j++) { 			if (a[i-1] == b[j-1]) { 				dp[i][j] = dp[i - 1][j-1] + 1; 			} 			else { 				dp[i][j] = max(dp[i - 1][j],dp[i][j-1]); 			} 		} 	} 	printf("%d\n", dp[strlen(a)][strlen(b)]); 	system("pause");     return 0; } 上面那个不能处理有重复字符的字符串

user: user-2
content: #include "stdafx.h" #include<string.h> #include<stdlib.h> void lower(char *a) { 	for (int i = 0; a[i] != '\0'; i++) { 		if (a[i] >= 'A' && a[i] <= 'Z') { 			a[i] = a[i] - 'A' + 'a'; 		} 	} } int max(int a, int b) { 	return (a > b ?  a : b); }  int main() { 	char a[100] = "abb", b[100] = "aca"; 	int dp[100]; 	//scanf("%s%s", a, b); 	lower(a); 	lower(b); 	dp[0] = 0; 	for (int i = 1; a[i-1] != '\0'; i++) { 		for (int j = 1; b[j-1] != '\0'; j++) { 			if (a[i-1] == b[j-1]) { 				dp[i] = max(dp[i - 1] + 1,dp[i]); 			} 			else { 				dp[i] = max(dp[i - 1],dp[i]); 			} 		} 	} 	printf("%d\n", dp[strlen(a)]); 	system("pause");     return 0; 终于能上网了

user: user-2
content: 电脑上不了网，只能手机发图片了

user: user-3
content: 引用 4 楼 qq_29120981 的回复:不区分大小写的话先把字符串预处理一下 这个呢  #include<stdio.h> #include<string.h> #define MAX 100  int main(void) { 	char str1[MAX]={0},str2[MAX]={0},buf[MAX]; 	int i,j,k,l,ans,len,flag=0; 	ans = 0; 	scanf("%s%s",str1,str2); 	len = strlen(str1)>strlen(str2)?strlen(str2):strlen(str1); 	for(i=1;i<=len;i++) 	{ 		for(k=0;k<len;k++) 		{ 			for(l=0;l<i&&l+i<len;) 			{ 				for(j=0;j<i;j++,l++) 					if(strlen(str1)>len&&str2[l+k]!=0) 						buf[j] = str2[l+k]; 					else if(strlen(str1)<=len&&str2[l+k]!=0) 						buf[j] = str1[l+k]; 				buf[j] = 0; 				//printf("%s\n",buf); 				if(strstr(strlen(str1)>len?str1:str2,buf)==NULL) 					break; 				if(i>ans) 				{ 				    ans = i; 				    flag = !flag; 				    break; 				} 			} 			if(flag)             {                 flag = !flag;                 break;             } 		} 	}  	printf("%d",ans); 	return 0; }

user: user-0
content: 引用 3 楼 qq_29120981 的回复:仅供参考  #include<stdio.h> #include<string.h> #define MAX 100  int main(void) { 	char str1[MAX],str2[MAX],buf[MAX]; 	int i,j,k,l,ans,len; 	ans = 0; 	scanf("%s%s",str1,str2); 	len = strlen(str1)>strlen(str2)?strlen(str2):strlen(str1); 	for(i=1;i<=len;i++) 	{ 		for(k=0;k<len;k++) 		{ 			for(l=0;l<i;) 			{ 				for(j=0;j<i;j++,l++) 					if(strlen(str1)>len) 						buf[j] = str2[l+k]; 					else 						buf[j] = str1[l+k]; 				buf[j] = 0; 				//printf("%s\n",buf); 				if(strstr(strlen(str1)>len?str1:str2,buf)==NULL) 					break; 				if(i>ans)  					ans = i; 			} 		} 	} 	 	printf("%d",ans); 	return 0; } 大胸第，你这个程序跑不出结果

user: user-3
content: 不区分大小写的话先把字符串预处理一下

user: user-3
content: 仅供参考  #include<stdio.h> #include<string.h> #define MAX 100  int main(void) { 	char str1[MAX],str2[MAX],buf[MAX]; 	int i,j,k,l,ans,len; 	ans = 0; 	scanf("%s%s",str1,str2); 	len = strlen(str1)>strlen(str2)?strlen(str2):strlen(str1); 	for(i=1;i<=len;i++) 	{ 		for(k=0;k<len;k++) 		{ 			for(l=0;l<i;) 			{ 				for(j=0;j<i;j++,l++) 					if(strlen(str1)>len) 						buf[j] = str2[l+k]; 					else 						buf[j] = str1[l+k]; 				buf[j] = 0; 				//printf("%s\n",buf); 				if(strstr(strlen(str1)>len?str1:str2,buf)==NULL) 					break; 				if(i>ans)  					ans = i; 			} 		} 	} 	 	printf("%d",ans); 	return 0; }

user: user-0
content: 测试用例是4个。。。。。。

user: user-0
content: 大神们，这道题测试用例有3个，我就是case2不通过。这道题评论有12页，评论里提出来的用例我全通过，就是平台上的case2不通过，很苦恼