导弹拦截(dp复习)

题目描述:求最长下降子序列的长度

in:

7
1 7 3 5 9 4 8

out:

4

解释:1 3 4 8/1 3 5 8

长度为四

这让我想到了hdu上导弹拦截那道题,是求最长上升子序列长度

其转移方程为:

 dp[i]=max(dp[i],dp[j]+1);

如果a[j]<a[i],那么dp[i]就应该取dp[i]和dp[j]+1的最大值,由于是正序,j<i保证了dp[j]已经是j时的最优解

#include <iostream>
#include<cstring>
using namespace std;
int dp[10000],n;
int a[10000];
int dliworth(int n)
{
    int total=0;
    for(int i=0;i<n;i++)
    {
        dp[i]=1;
        for(int j=0;j<i;j++)
            if(a[j]<a[i])
            dp[i]=max(dp[i],dp[j]+1);
        total=max(total,dp[i]);
    }
    return total;
}
int main()
{
    while(cin>>n)
    {
        for(int i=0;i<n;i++)
            cin>>a[i];
        cout<<dliworth(n)<<endl;
        memset(a,0,sizeof(a));
        memset(dp,0,sizeof(dp));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/iloveysm/p/12253066.html