南阳36

本文介绍了求解两个字符串最长公共子序列的问题,并给出了两种实现方式:一种使用二维数组存储中间结果,另一种则进行了空间优化,仅用一维数组实现。通过状态转移方程递推求解,最终输出最长公共子序列的长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 1 /*
 2 状态转移方程如下 ai,bj分别代表a字符串和b字符串的i,j处的字符
 3         
 4             -> 0                            (i = j =0)
 5 v[i,j] =    -> v[i-1][j-1]                  (ai == bj)
 6             -> Max(v[i-1][j],v[i][j-1])     (ai != bj)
 7 */
 8 #include<cstdio>
 9 #include<cstring>
10 #define Max(a,b) ((a)>(b)?(a):(b))
11 using namespace std;
12 
13 char a[1005],b[1005];
14 int v[1005][1005];
15 int n,i,j;
16 
17 int main()
18 {
19     int n;
20     scanf("%d",&n);
21     while(n--)
22     {
23         scanf("%s%s",a,b);
24         for(i=0; a[i]!='\0'; ++i)
25         {
26             for(j=0; b[j]!='\0'; ++j)
27             {
28                 if(a[i] == b[j])
29                     v[i+1][j+1] = v[i][j] + 1;
30                 else
31                     v[i+1][j+1] = Max(v[i][j+1],v[i+1][j]);
32             }
33         }
34         printf("%d\n",v[i][j]);
35     }
36     return 0;
37 }
 1 //空间优化,只有一维时,v[i-1][j-1]会被覆盖,所以只需要开一个变量存储v[i-1][j-1]即可
 2 #include<cstdio>
 3 #include<cstring>
 4 using namespace std;
 5 
 6 char a[1005],b[1005];
 7 int v[1005];
 8 int n,i,j,t,temp;
 9 
10 int main()
11 {
12     scanf("%d",&n);
13     while(n--)
14     {
15         scanf("%s%s",a,b);
16         memset(v,0,sizeof v);
17         for(i=0; a[i]!='\0'; ++i)
18         {
19             t = 0;
20             for(j=0; b[j]!='\0'; ++j)
21             {
22                 temp = v[j];
23                 if(a[i] == b[j])
24                     v[j] = t + 1;
25                 else if(v[j] < v[j-1])
26                     v[j] = v[j-1];
27                 t = temp;
28             }
29         }
30         printf("%d\n",v[j-1]);
31     }
32     return 0;
33 }

 

转载于:https://www.cnblogs.com/qq188380780/p/6678471.html

城市 各市常住人口数(万人) 各市GDP(亿元) 一般公共预算收入(亿元) 一般公共预算支出(亿元) 各市电信网业务总量(亿元) 各市教育经费(万元) 各市公路线路里程(公里) 各市公路客运量(万人) 各市医疗卫生机构数量(个) 各市公共图书馆数量(个) 郑州市 1274 12691.02 1223.63 1624.44 211.01 3593633 13732 3942 6273 15 开封市 478 2557.03 179.27 429.47 40.83 1029123 9520 1609 3450 9 洛阳市 707 5447.12 397.92 641.71 78.2 1483930 19887 3226 4810 18 平顶山市 497 2694.16 203.21 336.33 42.23 932022 14819 1623 3706 10 安阳市 542 2435.47 200.58 374.28 51.71 1144978 13037 1666 5763 7 鹤壁市 157 1064.64 73.69 170.26 15.8 377791 4653 428 1405 6 新乡市 617 3232.53 208.28 440.31 61.74 1336299 13549 2453 5302 11 焦作市 352 2136.84 160.72 270.83 36.55 731773 8037 772 2784 8 濮阳市 374 1771.54 112.68 289.84 36.8 866038 7009 885 3998 7 许昌市 438 3655.42 189.12 325.75 37.86 939609 10095 917 3965 7 漯河市 237 1721.08 114.54 213.53 22.81 617296 5554 1195 2360 5 三门峡市 204 1582.54 142.44 250.49 21.62 591275 10268 1444 1904 7 南阳市 963 4342.22 224.83 691.56 75.22 2246128 40244 3520 10077 13 商丘市 772 3083.32 190.13 514.67 67.25 1439105 24864 2468 6316 9 信阳市 619 3064.96 135.39 610.53 51.55 1587995 27196 2603 4356 12 周口市 885 3496.23 158.24 666.8 68.9 1838684 24177 3745 7300 11 驻马店市 692 3082.82 181.61 479.51 57.54 1434611 22192 4482 4002 11 济源示范区 73 762.23 59.13 78.43 9.09 218853 2735 410 765 1
06-12
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值