动态规划实验(2)

第4关:最长单调子序列

#include<stdio.h>
#include<string.h>

int n;
struct node{
	int len;
	int a;
	int last;
}q[1005],max,temp;

int b[1005];


int main()
{
	max.len=-1;

	scanf("%d",&n);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&q[i].a);
		q[i].len=1;	
		q[i].last=-1;	
	}
	
	for(int i=0;i<n;i++)
	{
		for(int j=i-1;j>=0;j--)
		{
			if(q[i].a>q[j].a&&q[i].len<=q[j].len)
			{
				q[i].len=q[j].len+1;
				q[i].last=j;
			}
			if(q[i].len>=max.len)
			{
				max.len=q[i].len;
				max.last=q[i].last;
				max.a=q[i].a;
			}
		}
	}
//	for(int i=0;i<n;i++)
//	{
//		printf("%d %d\n",q[i].len,q[i].last);
//	}
	
	printf("%d\n",max.len);
	
	int t=max.len;
	b[t]=max.a;
	t--;
	temp.last=max.last;
	for(int i=max.len;i>=0;i--)
	{
		temp.a=q[temp.last].a;
		temp.last=q[temp.last].last;
		temp.len=q[temp.last].len;
		b[t]=temp.a;
		t--;
	}
	for(int i=1;i<=max.len;i++)
	{
		printf("%d ",b[i]);
	}
	return 0;
}

第5关:最长公共子序列(LCS)

#include<stdio.h>
#include<string.h>

char a[1005];
char b[1005];
int dp[1005][1005]={0};


int main()
{	
	scanf(" %s",&a);
	getchar();
	scanf(" %s",&b);
	int lena=strlen(a);
	int lenb=strlen(b);

	for(int i=0;i<lena;i++)
	{
		for(int j=0;j<lenb;j++)
		{
		
			if(a[i]==b[j])dp[i][j]=dp[i-1][j-1]+1;
			else
			{
				//dp[i][j]=dp[i-1][j];
				if(dp[i-1][j]<dp[i][j-1]&&i>=1) 
				{
					dp[i][j]=dp[i][j-1]; 
				}
				else if(j>=1)
				{
					dp[i][j]=dp[i][j-1];
				}
			}
		//	printf("%c %c %d %d %d\n",a[i],b[j],i,j,dp[i][j]);
			
		}
	}
	printf("%d",dp[lena-1][lenb-1]); 
	return 0;
}

都看到这里啦,点点关注叭

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值