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;
}
}

浙公网安备 33010602011771号