zoukankan      html  css  js  c++  java
  • BZOJ2423 [HAOI2010]最长公共子序列

    第一问是裸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
    %d
    ", f[cur][l2] % mod, g[cur][l2] % mod);
    62     return 0;
    63 }
    View Code
    By Xs酱~ 转载请说明 博客地址:http://www.cnblogs.com/rausen
  • 相关阅读:
    js-html音乐播放
    CSS-实现倒影效果box-reflect
    html-屏蔽按键盘空格键是滚动条向下滚动
    html-禁用右键、键盘F12、网页上选取内容、复制、粘贴
    js-回调函数
    man bash 关于shell的应有尽有 语法、快捷键...
    source vs export AND ctrl d vs ctrl z
    技术----阳春
    限流 降级
    linux TOP
  • 原文地址:https://www.cnblogs.com/rausen/p/4345399.html
Copyright © 2011-2022 走看看