题目:
思路:
cpp
如果小明最后一个挑战的对手是an,那么小明最多挑战了dp[n]个对手,但是不一定dp[n]就
是dp[]数组中的最大值,所以要遍历dp[]数组找最大值,才是小明一路挑战对手的最大值
样例【a1,a2,...an中战力并没有说是递增的】:[2, 1, 3, 4, 5, 0]
逐位计算 dp:
dp[1] = 1(2)
dp[2] = 1(1)
dp[3] = 2([1,3]/[2,3],长度 2)
dp[4] = 3([1,3,4],长度 3)
dp[5] = 4([1,3,4,5],长度 4)
dp[6] = 1(0,前面没有比它小的,长度 1)
全局最长递增子序列长度是 4(dp[5]),而最后一个 dp[6] = 1,远小于最大值!
可执行代码:
cpp
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+10;
long long a[N];
long long dp[N];//小明遇到的前N个对手:a1,a2,...aN中,如果小明最后一个挑战的对手是aN,那么小明最多挑战了dp[N]个对手
int main()
{
int n=0;cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
dp[0]=0;//小明遇到的前0个对手中,小明挑战的对手最多有0个
for(int i=1;i<=n;i++){
dp[i]=1;
for(int j=1;j<i;j++){//遍历一下i前面的,看看当前下标i前面有没有比a[i]小的元素
if(a[i]>a[j]) dp[i]=max(dp[i],dp[j]+1);//dp[i]和前面的元素相比肯定是等于或者加1
}
}
long long ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,dp[i]);
}
cout<<ans;
return 0;
}
通过样例:
