随笔 - 375  文章 - 2  评论 - 105  阅读 - 18万 

第一问是裸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
复制代码

 

posted on   Xs酱~  阅读(291)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示