POJ2533:Longest Ordered Subsequence(LIS) 动态规划

来源:互联网 发布:淘宝店铺综合评分68 编辑:程序博客网 时间:2024/06/06 00:17

题意:输出最长递增子序列长度
思路一:刷表法

#include<cstdio>#include<cstring>#include <iostream>#define maxn 1005using namespace std;int a[maxn];int dp[maxn];int main(){    int n,ans=0;    scanf("%d",&n);    for(int i=0;i<n;i++){        scanf("%d",&a[i]);        dp[i]=1;    }    //DP,从第一个元素开始,如果这个元素后面有a[j]>a[i],且dp[j]<dp[i]+1,那么更新dp[j]    for(int i=0;i<n-1;i++)        for(int j=i+1;j<n;j++)            if(a[j]>a[i]&&dp[j]<=dp[i])                dp[j]=dp[i]+1;    for(int i=0;i<n;i++){//找出最大长度        if(dp[i]>ans)  ans=dp[i];    }    printf("%d\n",ans);    return 0;}

思路二:填表法

#include<cstdio>#include<cstring>#include <iostream>#define maxn 1005using namespace std;int a[maxn];int dp[maxn];int main(){    int n,ans=0;    scanf("%d",&n);    for(int i=0;i<n;i++){        scanf("%d",&a[i]);        dp[i]=1;    }//DP从第一个元素开始,找到该元素能接上的最大长度并记录    for(int i=0;i<n;i++){        int flag=0;        for(int j=0;j<i;j++){            if(a[j]<a[i]&&dp[j]>flag)                flag=dp[j];//a[i]能够接上的最长序列        }        dp[i]=flag+1;    }    for(int i=0;i<n;i++){        if(dp[i]>ans)  ans=dp[i];    }    printf("%d\n",ans);    return 0;}


原创粉丝点击