您的位置:首页 > 其它

【最长上升子序列】HDU 1087——Super Jumping! Jumping! Jumping!

2013-08-03 19:26 477 查看
来源:点击打开链接

最长上升子序列的考察,是一个简单的DP问题。我们每一次求出从第一个数到当前这个数的最长上升子序列,直至遍历到最后一个数字为止,然后再取dp数组里最大的那个即为整个序列的最长上升子序列。我们用dp[i]来存放序列1-i的最长上升子序列的长度,那么dp[i]=max(1,dp[j])+1,(j∈[1, i-1]); 显然dp[1]=1,我们从i=2开始遍历后面的元素即可。

这个没有优化,效率是O(N^2),可以通过二分进行进一步的优化。

#include <iostream>
#include <cstring>
using namespace std;

int dp[1009];
int a[1009];

int lis(int n)
{
    int sum=0;
    dp[0]=a[0];
    for(int i=1;i<n;i++)
    {
        dp[i]=a[i];
        for(int j=0;j<i;j++)
        {
            if(a[i]>a[j] && dp[i]<dp[j]+a[i])
            {
                dp[i]=dp[j]+a[i];
            }
            if(sum<dp[i])
                sum=dp[i];
        }
    }
    return sum;
}

int main()
{
    int testcase;
    while(cin>>testcase && testcase!=0)
    {
        memset(dp,0,sizeof(dp));
        memset(a,0,sizeof(a));
        for(int i=0;i<testcase;i++)
        {
            cin>>a[i];
        }
        cout<<lis(testcase)<<endl;
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐