糯米

TI DaVinci, gstreamer, ffmpeg
随笔 - 167, 文章 - 0, 评论 - 47, 引用 - 0
数据加载中……

POJ 1080 Human Gene Functions 动态规划

思路:

由于上下都可以加空格,这个有点崩溃。
但后来发现还是可以用动态规划做的。
假设输入的字符串分别为 A,B
f[i][j] = { 从 A[i] 和 B[j] 开始匹配,所能达到的最大值 }
假设 A[i] = G,B[j] = C
那么现在的情况就是
Gxxxxx
Cxxxxx
状态转移为
=> f[i + 1][j] + table(A[i], '-')
G...
-C..

=> f[i][j + 1] + table(B[j], '-')
-G..
C...

=> f[i + 1][j + 1] + table(A[i], B[j])
G...
C...

可以用滚动数组。

所以这样就解决了,觉得很神奇。

#include <stdio.h>

int N, M, f[2][256], *pre, *cur;
char A[256], B[256], map[256];
int tbl[5][5= {
    
5-1-2-1-3},
    
{-1,  5-3-2-4},
    
{-2-3,  5-2-2},
    
{-1-2-2,  5-1},
    
{-3-4-2-1,  0},
}
;

inline 
void swap(int **a, int **b)
{
    
int *= *a;
    
*= *b;
    
*= t;
}


inline 
int max(int a, int b)
{
    
return a > b ? a : b;
}


inline 
int min(int a, int b)
{
    
return a < b ? a : b;
}


inline 
int dif(char a, char b)
{
    
return tbl[map[a]][map[b]];
}


int main()
{
    
int t, i, j;
    
    freopen(
"e:\\test\\in.txt""r", stdin);

    map[
'A'= 0;
    map[
'C'= 1;
    map[
'G'= 2;
    map[
'T'= 3;
    map[
'-'= 4;
 
    scanf(
"%d"&t);
    
while (t--{
        scanf(
"%d%s%d%s"&N, &A[1], &M, &B[1]);            
        pre 
= &f[0][0];
        cur 
= &f[1][0];
        cur[
0= 0;
        
for (i = 1; i <= M; i++)
            cur[i] 
= dif(B[i], '-'+ cur[i - 1];
        
for (i = 1; i <= N; i++{
            swap(
&pre, &cur);
            cur[
0= dif(A[i], '-'+ pre[0];
            
for (j = 1; j <= M; j++{
                cur[j] 
= dif(A[i], B[j]) + pre[j - 1];
                cur[j] 
= max(cur[j], dif(A[i], '-'+ pre[j]);
                cur[j] 
= max(cur[j], dif(B[j], '-'+ cur[j - 1]);
            }

        }

        printf(
"%d\n", cur[M]);
    }

}

posted on 2010-04-21 21:41 糯米 阅读(369) 评论(0)  编辑 收藏 引用 所属分类: POJ


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理