poj 1836

来源:互联网 发布:担保公司业务软件 编辑:程序博客网 时间:2024/06/06 14:08

求两遍LIS,枚举每个点

代码如下

补充一下,l[i],r[i]也可以直接用lower_bound(dp,dp+n,3.0)-dp代替

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;int main(){double h[1005],dp[1005];int l[1005],r[1005];int n;scanf("%d",&n);for(int i=0;i<n;i++)scanf("%lf",&h[i]);int cnt=1;for(int i=0;i<n;i++)dp[i]=3.0;for(int i=0;i<n;i++){int p=lower_bound(dp,dp+n,h[i])-dp;cnt=max(cnt,p+1);dp[p]=h[i];l[i]=cnt;}cnt=1;for(int i=0;i<n;i++)dp[i]=3.0;for(int i=n-1;i>=0;i--){int p=lower_bound(dp,dp+n,h[i])-dp;cnt=max(cnt,p+1); dp[p]=h[i];r[i]=cnt;}int ans=max(l[n-1],r[0]);for(int i=0;i<n-1;i++)for(int j=i+1;j<n;j++)ans=max(ans,l[i]+r[j]);printf("%d\n",n-ans);  } 


原创粉丝点击