2021年2月21日
几天本来想着复习会动态规划 然后学习二叉堆
然后就一发不可收拾了
首先是最长公共子序列
题目就不列举了
目前代码
#include<bits/stdc++.h>
using namespace std;
int a[100005];
int b[100005];
int dp[100005][100005]={0};
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int j=1;j<=n;j++)
cin>>b[j];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(a[i]==b[j])
{
dp[i][j]=dp[i-1][j-1]+1;
}
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
cout<<dp[n][n]<<endl;
}
目前通过率
实在想不通了 因为不可以创建如上的dp数组 然后我没办法了 看了题解 然后讲了很多东西 要排序 然后求最长递增子序列 然后七七八八的
于是我复习了一下最长递增子序列
也就是
又过不了
目前代码
#include<stdio.h>
#include<string.h>
int fun(int a[],int n)
{
int max=a[0];
for(int i=1;i<=n;i++)
if(max<a[i])max=a[i];
return max;
}
int a[1000005];
char str[5000005];
int b[1000005];
int fun1(int a[],char c[])
{
int i=0;
int n=0;
while(c[i])
{
if('9'>=c[i]&&c[i]>='0'&&c[i])
{
int k=c[i]-'0';
i++;
while('9'>=c[i]&&c[i]>='0'&&c[i])
{
k=k*10+c[i]-'0';
i++;
}
a[n++]=k;
}
else i++;
}
return n;
}
main()
{
int i;
gets(str);
int n=fun1(a,str);
memset(b,0,sizeof(b));
//for(int i=0;i<n;i++)
//printf("%d ",a[i]);
int j;
b[0]=1;
for(i=0;i<=n;i++)
{ int max=0;//记录之前子序列的最大值
for(j=0;j<i;j++)
{
if(a[i]<a[j]&&b[j]>max){//在a[0]到a[i-1]内找到一个比a[i]并且子序列最长的序列 然后讲 a[i]加入这个子序列里面去
max=b[j];
}
}
b[i]=max+1;
}
printf("%d\n",fun(b,n));
memset(b,0,sizeof(b));
b[0]=1;
for(i=0;i<=n;i++)
{
int max=0;
for(j=0;j<i;j++)
{
if(a[i]>a[j]&&b[j]>max)
{
max=b[j];
}
}
b[i]=max+1;
}
printf("%d",fun(b,n));
}
快崩溃了 救救孩子吧