码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ2423 [HAOI2010]最长公共子序列

时间:2015-03-17 21:40:17      阅读:165      评论:0      收藏:0      [点我收藏+]

标签:

第一问是裸DP。。。。

第二问还是裸DP,注意一种特殊情况(我忘了是什么特殊情况了QAQQQ)

滚动数组可以压掉一维,而且 ^ (xor)比 ! (not)慢。。。

 

技术分享
 1 /**************************************************************
 2     Problem: 2423
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:964 ms
 7     Memory:892 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11 #include <cstring>
12 #include <algorithm>
13   
14 using namespace std;
15 const int N = 5005;
16 const int mod = 100000000;
17 int f[2][N], g[2][N];
18 int l1, l2, cur, i, j;
19 char s1[N], s2[N];
20   
21 void read(){
22     char ch = getchar();
23     while ((ch < A || ch > Z) && ch != .)
24         ch = getchar();
25     while (ch != .)
26         s1[++l1] = ch, ch = getchar();
27     ch = getchar();
28     while ((ch < A || ch > Z) && ch != .)
29         ch = getchar();
30     while (ch != .)
31         s2[++l2] = ch, ch = getchar();
32 }
33   
34 int main(){
35     read();
36     for (j = 0; j <= l2; ++j)
37         g[0][j] = 1;
38     g[1][0] = 1;
39     cur = 0;
40     for (i = 1; i <= l1; ++i)
41         for (j = 1, cur ^= 1; j <= l2; ++j)
42             if (s1[i] == s2[j]){
43                 f[cur][j] = f[!cur][j - 1] + 1;
44                 g[cur][j] = g[!cur][j - 1];
45                 if (f[cur][j] == f[cur][j - 1])
46                     g[cur][j] += g[cur][j - 1], g[cur][j] %= mod;
47                 if (f[cur][j] == f[!cur][j])
48                     g[cur][j] += g[!cur][j], g[cur][j] %= mod;
49             }else{
50                 f[cur][j] = f[!cur][j], g[cur][j] = g[!cur][j];
51                 if (f[cur][j] < f[cur][j - 1]){
52                     f[cur][j] = f[cur][j - 1];
53                     g[cur][j] = g[cur][j - 1];
54                 }else if (f[cur][j] == f[cur][j - 1]){
55                     g[cur][j] += g[cur][j - 1];
56                     if (f[!cur][j - 1] == f[cur][j])
57                         g[cur][j] -= g[!cur][j - 1];
58                     g[cur][j] %= mod;
59                 }
60             }
61     printf("%d\n%d\n", f[cur][l2] % mod, g[cur][l2] % mod);
62     return 0;
63 }
View Code

 

BZOJ2423 [HAOI2010]最长公共子序列

标签:

原文地址:http://www.cnblogs.com/rausen/p/4345399.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!