codevs1044拦截导弹

这个题第一问是求最长下降子序列,第二问可以转化成求最长上升子序列,为什么?
因为我们每遇到有hi < hj的情况(i < j)都要再使用一枚导弹,因为导弹只处理hi >hj的情况嘛,很好理解的吧
所以代码如下:
(完全可以更短)

#include 
#include 
#include 
#include 
using namespace std;
int dp[5000];
int maps[5000];
int n=0;
int main()
{
    int ans = 0,anss = 0;
    while(scanf("%d",&maps[++n]) != EOF)
    {

        for(int i = 1; i <= n; i ++)
        {
            dp[i] = 1;
            for(int j = 1; j < i; j ++)
            if(maps[j] > maps[i])
            {
                dp[i] = max(dp[j]+1,dp[i]); 
            }
            ans = max(dp[i],ans);
        }   
        for(int i = 1; i <= n; i ++)
        {
            dp[i] = 1;
            for(int j = 1; j < i; j ++)
            if(maps[j] < maps[i])
            {
                dp[i] = max(dp[j]+1,dp[i]); 
            }
            anss = max(dp[i],anss);
        }   

    }
    cout <cout <return 0;
}

你可能感兴趣的:(动态规划)