luogu 4059 [Code+#1]找爸爸 动态规划

Code: 

#include <cstdio>  
#include <cstring> 
#include <algorithm> 
#define N 3003  
#define ll long long 
#define setIO(s) freopen(s".in", "r" , stdin) 
using namespace std;      
char str[N];   
int S[N], T[N], d[6][6], n, m; 
ll f[N][N], g[N][N], h[N][N];      
int id(char c) 
{
    if(c == 'A') return 1; 
    if(c == 'T') return 2; 
    if(c == 'G') return 3;  
    if(c == 'C') return 4;         
}                           
int main() 
{
    // setIO("input");   
    int i , j, A, B; 
    scanf("%s", str + 1), n = strlen(str + 1); 
    for(i = 1; i <= n ; ++ i) S[i] = id(str[i]);         
    scanf("%s", str + 1), m = strlen(str + 1); 
    for(i = 1; i <= m ; ++ i) T[i] = id(str[i]); 
    for(i = 1; i <= 4 ; ++ i) 
    {
        for(j = 1; j <= 4; ++j) scanf("%d", &d[i][j]);  
    }        
    scanf("%d%d", &A, &B);   
    memset(f, -63, sizeof(f)), memset(g, -63, sizeof(g)), memset(h, -63, sizeof(h));  
    g[1][0] = h[0][1] = - A, f[0][0] = 0;    
    for(i = 1; i <= n ; ++ i) 
    {
        for(j = 1; j <= m ; ++ j) 
        {     
            f[i][j] = max(f[i - 1][j - 1], max(g[i - 1][j - 1], h[i - 1][j - 1])) + d[S[i]][T[j]];        
            g[i][j] = max(max(f[i - 1][j], h[i - 1][j]) - A, g[i - 1][j] - B);    
            h[i][j] = max(max(f[i][j - 1], g[i][j - 1]) - A, h[i][j - 1] - B);     
        }
    }     
    printf("%lld\n", max(max(f[n][m], g[n][m]), h[n][m]));      
    return 0; 
}

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值