luogu1140相似基因

题面

  • 有可能最大值是负数,要初始化f为极小值
  • 要特别处理第一位与空格匹配的情况
  • 分清i,j(wa了无数次QAQ)
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int maxn=1e6+5;
 4 const int INF=1e9+7;
 5 int v[6][6]
 6 {
 7     {0,0,0,0,0,0},
 8     {0,5,-1,-2,-1,-3},
 9     {0,-1,5,-3,-2,-4},
10     {0,-2,-3,5,-2,-2},
11     {0,-1,-2,-2,5,-1},
12     {0,-3,-4,-2,-1,0},    
13 };
14 int n,m,a[105],b[105];
15 char cha;
16 int f[205][205];
17 template <class t>void red(t &x)
18 {
19     x=0;
20     int w=1;
21     char ch=getchar();
22     while(ch<'0'||ch>'9')
23     {
24         if(ch=='-')
25             w=-1;
26         ch=getchar();
27     }
28     while(ch>='0'&&ch<='9')
29     {
30         x=(x<<3)+(x<<1)+ch-'0';
31         ch=getchar();
32     }
33     x*=w;
34 }
35 void input()
36 {
37     freopen("input.txt","r",stdin);
38 }
39 void read()
40 {
41     red(n);
42     for(int i=1;i<=n;++i)
43     {
44         cha=getchar();
45         if(cha=='A')
46             a[i]=1;
47         if(cha=='C')
48             a[i]=2;
49         if(cha=='G')
50             a[i]=3;
51         if(cha=='T')
52             a[i]=4;
53     }
54     red(m);
55     for(int i=1;i<=m;++i)
56     {
57         cha=getchar();
58         if(cha=='A')
59             b[i]=1;
60         if(cha=='C')
61             b[i]=2;
62         if(cha=='G')
63             b[i]=3;
64         if(cha=='T')
65             b[i]=4;
66     }
67 }
68 void work()
69 {
70     for(int i=1;i<=n;++i)
71         for(int j=1;j<=m;++j)
72             f[i][j]=-INF;
73     for(int i=1;i<=n;++i)
74         f[i][0]=f[i-1][0]+v[a[i]][5];
75     for(int i=1;i<=m;++i)
76         f[0][i]=f[0][i-1]+v[5][b[i]];        
77     for(int i=1;i<=n;++i)
78         for(int j=1;j<=m;++j)
79             f[i][j]=max(f[i][j],max(f[i-1][j-1]+v[a[i]][b[j]],max(f[i-1][j]+v[a[i]][5],f[i][j-1]+v[5][b[j]])));
80     printf("%d",f[n][m]);
81 }
82 int main()
83 {
84     input();
85     read();
86     work();
87     return 0;
88 }
View Code

猜你喜欢

转载自www.cnblogs.com/Achensy/p/10778025.html