题目:http://poj.org/problem?id=2533
HDU 1087与之类似,不过是求最大和,不是求长度
这是用dp写的LIS,复杂度n*n,用二分nlogn写LIS:https://blog.youkuaiyun.com/qq_32259423/article/details/82974790
dp[i]表示结尾是a[i]的长长度是多少.
递推式: dp[i]=dp[j]+1 用i之前的每一位作为结尾的所有最优状态更新i的状态.
代码:
#include<cstdio>
#include<cmath>
#include<string>
#define fuck(x) std::cout<<"["<<#x<<"->"<<x<<"]"<<endl;
using namespace std;
typedef long long ll;
const int M=1e3+5;
const ll inf=1e18+5;
ll dp[M];
ll a[M];
int main()
{
int n;
while(~scanf("%d",&n)&&n){
fill(dp,dp+M,-inf);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
dp[0]=0;
dp[1]=1;
for(int i=1;i<=n;i++){
for(int j=0;j<i;j++){
if(a[i]>a[j])dp[i]=max(dp[i],dp[j]+1);
}
}
ll ans=0;
for(int i=0;i<=n;i++){
ans=max(ans,dp[i]);
}
printf("%lld\n",ans);
}
return 0;
}