http://poj.org/problem?id=2250
最长公共子序列LCS 动态规划DP
Time Limit: 1000MS | Memory Limit: 65536K | |||
Special Judge |
Description
Input
Output
Sample Input
die einkommen der landwirte sind fuer die abgeordneten ein buch mit sieben siegeln um dem abzuhelfen muessen dringend alle subventionsgesetze verbessert werden # die steuern auf vermoegen und einkommen sollten nach meinung der abgeordneten nachdruecklich erhoben werden dazu muessen die kontrollbefugnisse der finanzbehoerden dringend verbessert werden #
Sample Output
die einkommen der abgeordneten muessen dringend verbessert werden
/* Author : yan * Question : POJ 2250 Compromise * Data && Time : Wednesday, January 05 2011 01:35 PM */ #include<stdio.h> #define MAX 101 #define MAXL 31 int opt[MAX][MAX]; int path[MAX][MAX]; char dic1[MAX][MAXL]; char dic2[MAX][MAXL]; char tmp; void printfLCS(int a,int b) { if( a==0 || b==0 ) return; if(path[a][b]==0) { printfLCS(a-1,b-1); printf("%s ",dic1[a]); } else if(path[a][b]==-1) printfLCS(a,b-1); else printfLCS(a-1,b); } int main() { //freopen("input","r",stdin); int cnt,cnt1=1; int i,j; while(scanf("%s",dic1[1])!=EOF) { cnt=2; while(scanf("%s",dic1[cnt])&&dic1[cnt][0]!='#') cnt++; while(scanf("%s",dic2[cnt1])&&dic2[cnt1][0]!='#') cnt1++; for(i=1;i<cnt;i++) for(j=1;j<cnt1;j++) { if( !strcmp(dic1[i],dic2[j]) ) opt[i][j]=opt[i-1][j-1]+1,path[i][j]=0; else if(opt[i][j-1]>opt[i-1][j]) opt[i][j]=opt[i][j-1],path[i][j]=-1; else opt[i][j]=opt[i-1][j],path[i][j]=1; } printfLCS(cnt-1,cnt1-1); printf("/n"); cnt=cnt1=1; } return 0; }
改成循环数组,优化后
/* Author : yan * Question : POJ 2250 Compromise * Data && Time : Wednesday, January 05 2011 01:35 PM */ #include<stdio.h> #define MAX 101 #define MAXL 31 int opt[2][MAX]; int path[MAX][MAX]; char dic1[MAX][MAXL]; char dic2[MAX][MAXL]; char tmp; void printfLCS(int a,int b) { if( a==0 || b==0 ) return; if(path[a][b]==0) { printfLCS(a-1,b-1); printf("%s ",dic1[a]); } else if(path[a][b]==-1) printfLCS(a,b-1); else printfLCS(a-1,b); } int main() { freopen("input","r",stdin); int cnt,cnt1=1; int i,j; while(scanf("%s",dic1[1])!=EOF) { cnt=2; while(scanf("%s",dic1[cnt])&&dic1[cnt][0]!='#') cnt++; while(scanf("%s",dic2[cnt1])&&dic2[cnt1][0]!='#') cnt1++; for(i=1;i<cnt;i++) for(j=1;j<cnt1;j++) { if( !strcmp(dic1[i],dic2[j]) ) opt[i%2][j]=opt[(i-1)%2][j-1]+1,path[i][j]=0; else if(opt[i%2][j-1]>opt[(i-1)%2][j]) opt[i%2][j]=opt[i%2][j-1],path[i][j]=-1; else opt[i%2][j]=opt[(i-1)%2][j],path[i][j]=1; } printfLCS(cnt-1,cnt1-1); printf("/n"); cnt=cnt1=1; } return 0; }