题目链接:
hdu 1513:http://acm.hdu.edu.cn/showproblem.php?pid=1513
nyoj 37:http://acm.nyist.net/JudgeOnline/problem.php?pid=37
nyoj 36:http://acm.nyist.net/JudgeOnline/problem.php?pid=36
两者几乎相同,核心代码相同,只是范围不相同,前者多用了一个滚动数组,
都用到了求最长公共子序列。
hdu 1513: 代码: #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int num[2][5010]; int main(){ char str[5010],str1[5010]; int i,j,k,t; int n; // scanf("%d",&n); while(~scanf("%d",&n)){ getchar(); scanf("%s",str); //k=strlen(str); memset(num,0,sizeof(num)); // for(i=0;i<=k;i++) // num[i][0]=num[0][i]=0; t=0; for(i=n-1;i>=0;i--) str1[t++]=str[i]; for(i=1;i<=n;i++){ for(j=1;j<=n;j++){ if(str[i-1]==str1[j-1]) num[i%2][j]=num[(i-1)%2][j-1]+1; else num[i%2][j]=max(num[(i-1)%2][j],num[i%2][j-1]); } } printf("%d\n",n-num[n%2][n]); } return 0; } nyoj-37: #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int num[1200][1200]; int main(){ char str1[1200],str2[1200]; int n,i,j,k,t; scanf("%d",&n); while(n--){ scanf("%s",str1); getchar(); memset(num,0,sizeof(num)); k=strlen(str1); for(t=0,i=k-1;i>=0;i--){ str2[t++]=str1[i]; } for(i=1;i<=k;i++){ for(j=1;j<=k;j++){ if(str1[i-1]==str2[j-1]) num[i][j]=num[i-1][j-1]+1; else num[i][j]=max(num[i][j-1],num[i-1][j]); } } printf("%d\n",k-num[k][k]); } // while(1); return 0; }
nyoj-36: #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int max(int a,int b){ if(a>b) return a; return b; } int num[2][1200]; int main(){ int i,j,len1,len2,t; char str[1200],str1[1200]; int n; scanf("%d",&n); while(n--){ scanf("%s %s",str,str1); getchar(); len1=strlen(str); len2=strlen(str1); memset(num,0,sizeof(num)); for(i=1;i<=len1;i++){ for(j=1;j<=len2;j++) { if(str[i-1]==str1[j-1]) num[i%2][j]=num[(i-1)%2][j-1]+1; else num[i%2][j]=max(num[(i-1)%2][j],num[i%2][j-1]); } } printf("%d\n",num[len1%2][len2]); } // while(1); return 0; }