橘甜

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 :: 管理 ::

https://vjudge.net/contest/409169#problem/E

题意:

棋子都用正整数或“开始”或“结束”标记。玩家从起点开始,最后必须跳到终点。在跳跃过程中,玩家将访问路径中的棋子,但是每个人都必须从一个棋子跳到另一个绝对更大的棋子(你可以假设起点是最小值,终点是最大值)。并且所有球员都不能倒退。一个跳跃可以从西洋棋棋子到下一个,也可以穿过许多西洋棋棋子,甚至你可以直接从起点到达终点。当然,在这种情况下,你得到零点。您的任务是根据给定的棋子列表输出最大值。

简单来说:求给定序列中上升子序列的最大值

题解:dp[i]表示以a[i]作为结尾的时候得到的上升子序列的最大值,以a[i]作为结尾所以一定有a[i],然后找i前面的值,如果有小于a[i]的,再决定取还是不取。

           最后遍历一遍数组找出最大就好。

代码:

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int dp[1005];
int a[1005];
int main()
{
    int n;
    while(cin>>n&&n)
    {
        int ans=INT_MIN;
        for(int i=1;i<=n;i++)
            cin>>a[i];
        for(int i=1;i<=n;i++)
        {
            dp[i]=a[i];
            for(int j=1;j<i;j++)
            {
                if(a[i]>a[j])
                {
                    dp[i]=max(dp[i],dp[j]+a[i]);
                }
            }
            ans=max(ans,dp[i]);
        }
        cout<<ans<<endl;
    }
}

posted on 2021-01-07 11:01  橘甜  阅读(114)  评论(0)    收藏  举报