NYOJ 17(LIS转为LCS,但是MLE)
#include<stdio.h> #include<string.h> #define N 10001 #define MAX(m,n) ((m)>(n)?(m):(n)) char a[N],b[N]; int d[N][N]; int cmp(const void *a,const void *b) { return *(char *)a-*(char *)b; } int My_Cancel(int len)/*删除相邻的同样数据,不相邻的并不删除,即aabbab,输出abab不是 ab,成为单调递增,否则成为单调不减序列**/ { int i,j=0; for(i=0;i<len;i++) { if(a[i+1]==a[i]) continue; else { a[j+1]=a[i+1]; j++; } } return j; } int LISL(int len) { int i,j; for(i=1;i<=len;i++) d[i][0]=0; for(j=1;j<=len;j++) d[0][j]=0; for(i=1;i<=len;i++) for(j=1;j<=len;j++) if(a[i-1]==b[j-1]) d[i][j]=d[i-1][j-1]+1; else d[i][j]=MAX(d[i][j-1],d[i-1][j]); return d[len][len]; } int main() { int T,len1,len2;int i,j; scanf("%d%*c",&T); while(T--) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); memset(d,0,sizeof(d)); scanf("%s%*c",a); len1=strlen(a); len2=My_Cancel(len1); memcpy(b,a,sizeof(a)); qsort(b,len2,sizeof(char),cmp); printf("%d\n",LISL(len2)); } return 0; }
作者:火星十一郎
本文版权归作者火星十一郎所有,欢迎转载和商用,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.