动态规划(最长公共子序列的长度)

给定两个数组X和Y,输出X和Y最长公共子序列的长度。
输入:
第一行输入测试数据组数;
每组测试数据包括两行,第一行代表数组X,第二行代表数组Y;其中每行的第一个数字代表数组长度。
输入样例:
1
4 1 3 4 5
6 1 2 3 4 5 6
输出样例:
4

代码:

#include<stdio.h>
int max(int i,int j)
{
if(i>=j) return i;
else return j;
}
int Mostsub(int* a,int* b,int l1,int l2)
{
int length[l1+1][l2+1];
for(int i=0;i<=l1;i++)
length[i][0] = 0;
for(int j=0;j<=l2;j++)
length[0][j] = 0;

for(int i=1;i<=l1;i++)
    {
	 for(int j=1;j<=l2;j++)
        
	   {
		 if(a[i] == b[j])   length[i][j] = length[i-1][j-1]+1;
         else   length[i][j] = max(length[i-1][j],length[i][j-1]);
         //printf("%d ",length[i][j]);
       }  
	   //printf("\n");
    }
return length[l1][l2];

}
int main()
{
int n;
scanf("%d",&n);
while(n–)
{
int nn,mm;
scanf("%d",&nn);
int a[nn+1];
for(int i=1;i<=nn;i++)
scanf("%d",&a[i]);
scanf("%d",&mm);
int b[mm+1];
for(int i=1;i<=mm;i++)
scanf("%d",&b[i]);
int s = Mostsub(a,b,nn,mm);
printf("\n%d\n",s);

}
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值