求最长公共子序列
由于这道题简单,方法多样,博主选了dp做
博主为朱老师的弟子
#include <cstdio> #include <cstdlib> #include <cstring> #include <sstream> //#define T int num1[100000]; int num2[100000]; int num3[10000][10000]; int m; char ch[250]; void initial() { memset(num1,0,sizeof(num1)); memset(num2,0,sizeof(num2)); memset(num3,0,sizeof(num3)); memset(ch,'\0',sizeof(ch)); m = 0; } int return_index() { int d = 0; for(int i =1;i < m;i++) { if(num1[i] < num1[m]) { if(num2[i] > num2[m]) { num2[m] = num2[i]; d = i; } } } return d; } void push_bback(int index) { int i = 1; for( i = 1;i < m;i++) { num3[m][i] = num3[index][i]; } num3[m][i] = 1; num2[m] = num2[index] + 1; } void print_num() { int i ; int MAX = 0; int index; for(i = 1;i<=m;i++) { if(num2[i] > MAX) { index = i; MAX = num2[i]; } } printf("Max hits: %d\n",MAX); for(i = 1;i<=m;i++) { if(num3[index][i]) { printf("%d\n",num1[i]); } } } int main() { #ifdef T freopen("in.txt","r",stdin); freopen("out.txt","w",stdout); #endif // T int n,t=0; // char ch[250]; scanf("%d",&n); getchar(); getchar(); for(t = 0; t < n;t++) { initial(); int in; if(t!=0) printf("\n"); while(gets(ch)&&ch[0]!='\0') { m++; //ch = getchar(); //printf("%c\n",ch); sscanf(ch,"%d",&num1[m]); //printf("%d ------ num1 ---- %d ---- m\n",num1[m],m); in = return_index(); // printf("in--------%d\n",in); push_bback(in); } print_num(); } return 0; }