第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;
}
都看到这里啦,点点关注叭