zoukankan      html  css  js  c++  java
  • poj 1080 dp

    基因配对 给出俩基因链和配对的值  求配对值得最大值  简单dp

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    using namespace std;
    const int maxa = 205;
    const int mina = -100000000;
    char str1[maxa], str2[maxa];
    int num[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,-10000000
    };
    int a1[maxa], a2[maxa];
    int dp[maxa][maxa];
    int main(){
       //freopen("in.cpp", "r", stdin);
        int t, n1, n2;
        scanf("%d", &t);
        while(t--){
            str1[0] = 4;
            str2[0] = 4;
            scanf("%d%s", &n1, str1+1);
            scanf("%d%s", &n2, str2+1);//printf("*");
    
            for(int i = 1; i <= n1; i++){
               // printf("%c", str1[i]);
                if(str1[i] == 'A')
                    str1[i] = 0;
                else if(str1[i] == 'C')
                    str1[i] = 1;
                else if(str1[i] == 'G')
                    str1[i] = 2;
                else str1[i] = 3;
            }
            for(int i = 1; i <= n2; i++){//printf("%d
    ", i);
                if(str2[i] == 'A')
                    str2[i] = 0;
                else if(str2[i] == 'C')
                    str2[i] = 1;
                else if(str2[i] == 'G')
                    str2[i] = 2;
                else str2[i] = 3;
            }//printf("*");
            for(int i = 1; i <= n1; i++){
                if(i == 0)
                    a1[i] = num[str1[i]][4];
                else a1[i] = num[str1[i]][4] + a1[i-1];
            }
            for(int i = 1; i <= n2; i++){
                if(i == 0)
                    a2[i] = num[str2[i]][4];
                else a2[i] = num[str2[i]][4] + a2[i-1];
            }
            /*for(int i =0; i <= n1; i++){
                printf("%d ", a1[i]);
            }puts("");*/
            for(int i = 0;i  <= n1; i++){
                for(int k = 0; k <= n2; k++){
                    dp[i][k] = mina;
                }
            }
            for(int i = 0; i <= n2; i++){
                if(i == 0)
                    dp[1][i] = num[str1[1]][str2[i]];
                else
                    dp[1][i] = num[str1[1]][str2[i]] + a2[i-1]-a2[0];
            }
            for(int i = 2; i <= n1; i++){
                dp[i][0] = a1[i] - a1[0];
                for(int k = 1; k <= n2; k++){
                    dp[i][k] = max(dp[i][k], dp[i-1][k]+ num[str1[i]][4]);
                    for(int j = 0; j < k; j++){
                        dp[i][k] = max(dp[i][k],dp[i-1][j] + num[str1[i]][str2[k]] + a2[k-1] - a2[j]);
                    }
                }
            }
            /*for(int i = 1; i <= n1; i++){
                printf("*%d ", num[str1[i]][str2[1]]+a1[i-1]-a1[0]);
            }puts("");;
            for(int i = 0; i <= n1; i++){
                for(int k = 0; k <= n2; k++){
                    printf("%d%d %d ",str1[i], str2[k], dp[i][k]);
                }puts("");
            }*/
            int ans = mina;
            for(int i = 0; i <= n2; i++){
                ans = max(ans, dp[n1][i] + a2[n2] - a2[i]);
               // printf("%d ", dp[n1][i] + a2[n2] - a2[i]);
            }//puts("");
            for(int i = 0; i <= n1; i++){
                ans = max(ans, dp[i][n2]+a1[n1] - a1[i]);
                //printf("%d ", dp[i][n2]+a1[n1] - a1[i]);
            }//puts("");
            printf("%d
    ", ans);
        }
    
    }
    View Code
  • 相关阅读:
    图像处理之图像分割
    matlab 矩阵运算技巧
    回溯法:八皇后问题
    spring框架学习笔记(二)
    spring框架学习笔记(一)
    java下搭建Webservice服务
    log4j使用
    Mybatis使用
    java序列化与反序列化
    java常用数据类型
  • 原文地址:https://www.cnblogs.com/icodefive/p/4187585.html
Copyright © 2011-2022 走看看