//#include //#include int main () { char *p; int n; int e; while (1==scanf ("%as", &p)) { // only GNU C n = strlen(p); e = nussinov (n, p); printf ("%s %d\n", p, e); free(p); p=0; }; return 0; } int nussinov (int n, char *p) { int l = n*n; int i; int j; int k; int at; int cur; int new; int *mat = calloc (l, sizeof(int)); // printf (">>> %d\n", n); for (i = n-1; i>=0; i--) for (j=i; j=j ? 0 : mat[(i+1)*(n-1) +j-1]; switch (p[i]) { case 'C': new += p[j]=='G' ? 1 : -999999; break; case 'G': new += p[j]=='C' || p[j]=='U' ? 1 : -999999; break; case 'A': new += p[j]=='U' ? 1 : -999999; break; case 'U': new += p[j]=='A' || p[j]=='G' ? 1 : -999999; break; default: new = -999999; }; if (cur < new) cur = new; }; for (k = i+1; k