1. 程式人生 > >HDU 1080 Human Gene Functions 基礎dp

HDU 1080 Human Gene Functions 基礎dp

dp黑洞再次憑一己之力寫對了一道dp水題,這個題很簡單,跟最長公共子序列一樣。

#include<iostream>
#include<cstdio>
#include<string.h>
#include<algorithm>
#include<cmath>
using namespace std;

int t,f[105][105],len1,len2;
char s1[105],s2[105];

int get(char ch)
{
    if (ch=='A') return 1;
    if (ch=='C') return 2;
    if (ch=='G') return 3;
    if (ch=='T') return 4;
    return 5;
}

int find(char a,char b)
{
    int x=get(a);
    int y=get(b);
    if (x==y) return 5;
    else if (x*y==2 || x*y==4 || x*y==20) return -1;
    else if (x*y==3 || x*y==8 || x*y==12 || x*y==15) return -2;
    else if (x*y==5 || x*y==6) return -3;
    else if (x*y==10) return -4;
}

int main()
{
    scanf("%d",&t);
    while (t--)
    {
        scanf("%d",&len1);
        for (int i=1; i<=len1; i++)
        {
            cin>>s1[i];
        }
        scanf("%d",&len2);
        for (int i=1; i<=len2; i++)
        {
            cin>>s2[i];
        }
        memset(f,0,sizeof(f));
        for (int i=1; i<=len1; i++)
        {
            f[i][0]=f[i-1][0]+find('-',s1[i]);
        }
        for (int i=1; i<=len2; i++)
        {
            f[0][i]=f[0][i-1]+find('-',s2[i]);
        }
        for (int i=1; i<=len1; i++)
        {
            for (int j=1; j<=len2; j++)
            {
                f[i][j]=max(f[i-1][j]+find(s1[i],'-'),f[i][j-1]+find(s2[j],'-'));
                f[i][j]=max(f[i][j],f[i-1][j-1]+find(s1[i],s2[j]));
                //cout<<"i="<<i<<" j="<<j<<endl;
                //cout<<"f1="<<f[i-1][j]+find(s1[i],'-')<<" f2="<<f[i][j-1]+find(s2[j],'-')<<" f3="<<f[i-1][j-1]+find(s1[i],s2[j])<<endl;
            }
        }
        printf("%d\n",f[len1][len2]);
    }
    return 0;
}

相關推薦

HDU 1080 Human Gene Functions 基礎dp

dp黑洞再次憑一己之力寫對了一道dp水題,這個題很簡單,跟最長公共子序列一樣。 #include<iostream> #include<cstdio> #include<string.h> #include<algorithm>

POJ-1080 Human Gene Functions---類似LCS

序列 define 相似度 -s get 思路 () sin algorithm 題目鏈接: https://cn.vjudge.net/problem/POJ-1080 題目大意: 給定兩組序列,要你求出它們的最大相似度,每個字母與其他字母或自身和空格對應都有一個打分,求

Human Gene Functions POJ 1080 最長公共子序列變形

cee diff print bmi ces -s compare %d determine Description It is well known that a human gene can be considered as a sequence, consisting

nyoj246 Human Gene Functions dp

最長子序列變形,用dp[i][j]表示長度為i時的str1和長度為j的時str2的最大匹配值。 故dp[0][0]為0,但如果只有i或j為一個0時不一定為0,因為兩個序列的長度必須相等所以此時需要通過新增'-'實現。 當i,j都不為0時有三種情況:1.i用'-'填補。2.j用

POJ1080 Human Gene Functions【最長公共子序列變形】

C++程式: #include<iostream> #include<cstring> #include<string> #include<algorithm> #include<map> using n

HDU 1024 Max Sum Plus Plus(基礎dp)

always cut panel face make return algo pan nbsp Max Sum Plus Plus Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K

HDU Problem F [ 數塔問題 ]——基礎dp模板題

Problem FTime Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other)Total Submission(s) : 6   Accepted Submission(s)

HDU 1159 【基礎DP 最長公共子序列】

TAT,,,覺得自己不算太理解,但是居然可以憑著記憶做出來。。蠻拼的 #include <cstdio> #include <cstring> #include <iostream> #include <string> usi

hdu 4719 Oh My Holy FFF(dp線段樹優化)

origin end should adding href ast left code padding Oh My Holy FFF Time Limit: 5000/2500 MS (Java/Others) Memory Limit: 65535/65535

hdu 4901 The Romantic Hero 計數dp,位計算

height accep fin -a can stop ott from include The Romantic Hero Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 131072/131072

HDU 4616 Game(經典樹形dp+最大權值和鏈)

using bsp mes size hdu pen typedef style 最大的 http://acm.hdu.edu.cn/showproblem.php?pid=4616 題意:給出一棵樹,每個頂點有權值,還有存在陷阱,現在從任意一個頂點出發,並且每個頂點只能

hdu 1078 FatMouse and Cheese【dp

mark .text ani addclass data dcl process con word 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1078 題意:每次僅僅能走 橫著或豎著的 1~k 個格

HDU 2089 不要62(數位DP

註意 break 大小 printf bre 表示 += 理解 ini 題意:求[n,m]內所有數字中不出現4也不出現連續62的數的個數。 輸入:n m,多組數據,以0 0結尾。 輸出:符合條件的數的個數。 限制:(0<n≤m<1000000) 時間:1000

HDU 1074 Doing Homework 狀態壓縮DP

output -- max 方式 sch adl struct work small 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1074 題目大意:小明打完比賽回來補作業,N個作業每個作業有 名字,截止日期,完成所需時間

HDU 1257 最少攔截系統 簡單DP

容易 target ++ font put 題目 ssi pre 路徑 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1257 題目大意:求有多少個單調非遞增序列。 解題思路:經典題的變形----LIS。可以按照題意,多次dp

HDU 6148 Valley Numer(數位DP

ima for oca ace end string map type http 1 #include <iostream> 2 #include <queue> 3 #include <stack> 4 #incl

HDU 4405 Aeroplane chess(概率dp

i++ 題意 clu esp ostream con mat 計算 stdin http://acm.hdu.edu.cn/showproblem.php?pid=4405 題意: 有個屌絲喜歡玩飛行棋,現在棋盤就編號為0~n,起點為0,終點為n,只要最後大於等於n就可

HDU - 1024 Max Sum Plus Plus(dp+滾動數組優化)

std scanf strong mes stat 方程 color ati algo 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=1024 題意:給定n個數字,求其中m段的最大值(段與段之間不用連續,但是一段中要連續)

HDU 6146 Pokémon GO DP,計數

-i namespace -1 space def bits const com highlight 題目鏈接:http://acm.hdu.edu.cn/showproblem.php?pid=6146 題意:~ 解法:原題。。http://blog.csdn.net/y

HDU 5542 The Battle of Chibi dp+樹狀數組

mod sizeof tac pro sum cpp case name problem 題目:http://acm.hdu.edu.cn/showproblem.php?pid=5542 題意:給你n個數,求其中上升子序列長度為m的個數 可以考慮用dp[i][j]表示