动态规划(DP),最长递增子序列(LIS)

时间:2023-03-08 17:16:18

题目链接:http://poj.org/problem?id=2533

解题报告:

状态转移方程:

dp[i]表示以a[i]为结尾的LIS长度

状态转移方程:

dp[0]=1;

dp[i]=max(dp[k])+1,(k<i),(a[k]<a[i])

#include <stdio.h>
#define MAX 1005 int a[MAX];///存数据
int dp[MAX];///dp[i]表示以a[i]为结尾的最长递增子序列(LIS)的长度 int main()
{
int i,j,n;
scanf("%d",&n);
for(i=;i<n;i++)
scanf("%d",&a[i]);
dp[]=;
int Max=;
for(i=;i<n;i++)
{
int k=;
for(j=;j<i;j++)
{
if(a[j]<a[i]&&k<dp[j])
{
k=dp[j];
}
}
dp[i]=k+;
}
for(i=;i<n;i++)
{
if(Max<dp[i])
Max=dp[i];
}
printf("%d\n",Max);
return ;
}