#include #include #include #include /* * All types have now the same sizeof they have in Haskell code. "Int" is 64bit * in Haskell; "Char" is 31bit. */ #define MAX(a,b) ( ((a) > (b)) ? (a) : (b) ) #define I2(n,i,j) ((i)*n+(j)) #define I4(n,i,j,k,l) ((i)*n*n*n + (j)*n*n + (k)*n + (l)) long long pseudoknot (long long, int *); long long pairs (int, int); void filluv (int name, int *inp, long long *t, long long *uv, long long n, long long i, long long j); long long pairs (int l,int r) { if (l=='A' && r=='U') return 1; if (l=='C' && r=='G') return 1; if (l=='G' && r=='C') return 1; if (l=='G' && r=='U') return 1; if (l=='U' && r=='A') return 1; if (l=='U' && r=='G') return 1; return 0; }; long long pseudoknot (long long n, int *inp) { if (n==0) return 0; long long i, j, k, l, a, b, c; //int at; long long cur, new, newL, newM, newR; long long *t = calloc (n*n , sizeof(long long)); long long *u = calloc (n*n*n*n, sizeof(long long)); long long *v = calloc (n*n*n*n, sizeof(long long)); // init for (i=0; i=0; i--) for (j=i; j0) { // T -> T c new = t[I2(n,i,j-1)]; cur = MAX(cur,new); }; for (a=i; a<=j; a++) { new = -999999; newL = a<=i ? 0 : t[I2(n,i,a-1)]; newR = a+1>=j-1 ? 0 : t[I2(n,a+1,j-1)]; if (pairs (inp[a],inp[j])) { new = newL + newR + 1; cur = MAX(cur,new); // printf ("P %3d %c %3d %c -- %4d + %4d + 1\n",a, inp[a],j, inp[j], newL, newR); } }; // n^3 loop for (a=i; a<=j; a++) for (b=a+1; b<=j; b++) for (c=b+1; c filluv ('U', inp, t, u, n, i, j); // fill up filluv ('V', inp, t, v, n, i, j); } // the n^2 loop cur = t[I2(n,0,n-1)]; free (t); free (u); free (v); return cur; } void filluv (int name, int *inp, long long *t, long long *uv, long long n, long long i, long long j) { long long k, l, a, b; long long cur, newL, newM, newR, new; for (k=i; k<=j; k++) for (l=k+1; l<=j; l++) { // u cur = -999999; // loop over inner part. for (a=i; a<=k; a++) { for (b=l-1; b<=j; b++) { if (pairs(inp[a], inp[j])) { newL = i