📄 最长不下降子序列.cpp
字号:
#include<stdio.h>
#include<stdlib.h>
int p[100]={3,18,7,14,10,12,23,41,16,24};
int dp[100];
int next[100];
int n;
int max(int* pp,int n)
{
int max;
max=pp[0];
for(int i=1;i<n;i++)
{
if(pp[i]>max)
{
max=pp[i];
}
}
return max;
}
int maxij(int* pp,int n)
{
int max;
max=0;
for(int i=1;i<n;i++)
{
if(pp[i]>pp[max])
{
max=i;
}
}
return max;
}
main()
{
int i;
int getlength(int);
scanf("%d",&n);
/*for(i=0;i<n;i++)
{
scanf("%d",&p[i]);
}*/
for(i=n-1;i>=0;i--)
{
dp[i]=getlength(i);
}
int head=maxij(dp,100);
do
{
printf("%d ",p[head]);
head=next[head];
}
while(head!=0);
}
int getlength(int i)
{
if(dp[i])
{
return dp[i];
}
int section[100]={0,0};
if(i==n-1)
{
dp[i]=1;
next[i]=0;
return dp[i];
}
for(int j=i+1;j<n;j++)
{
if(p[j]>=p[i])
{
section[j]=getlength(j);
}
}
dp[i]=max(section,100)+1;
next[i]=maxij(section,100);
return dp[i];
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -