UVA 481 what goes up

来源:互联网 发布:二十八间原创商铺 知乎 编辑:程序博客网 时间:2024/06/10 01:30

题目的意思是求给定一串数字序列,求出其最大升序列的长度并打印出来。

由于 数据是不定长的,不太会做,参考网上的代码:

http://blog.csdn.net/ronnoc/article/details/8719278

还是 不太好理解。

其中,vector<int> f;用来更新所求升序列的模样

        dp[i]是用来记录每次输入的数据更新之后对其升序列的长度的影响,其值为此时升序列的长度,如果长度加一说明该元素在升序列中,方便最后的输出。

ok【i】是找出每次影响升序列的值,也就是最后升序列的值

/*   Name: uva 481 what goes up -ac  Copyright:from net   Author: zj  Date: 06/04/13 19:48  Description: */#include<stdio.h>#include<vector>#define SMAX 1000010#include<algorithm>int n,a[SMAX];int dp[SMAX];int ok[SMAX];std::vector<int>f;std::vector<int>::iterator pf;int at[SMAX],pat;int max(int a,int b){if(a>b)return a;return b;}int main(){n=0;f.clear();int i,j;while(scanf("%d",&a[++n])!=EOF);n--;dp[1]=1;f.push_back(a[1]);for(i=2;i<=n;i++){pf = lower_bound( f.begin(), f.end(), a[i] );int k=pf-f.begin();printf("%d\n",k);if(pf==f.end()){f.push_back(a[i]);dp[i]=f.size();}else {*pf=a[i];//at[k]=i;dp[i]=k+1;}//f.push_back(a[i]);//sort(f.begin(),f.end());//for(j=0;j<f.size();j++)printf("%d ",f[j]);printf("\n");}int res=1;for(i=1;i<=n;i++)res=max(dp[i],res);int pes=1;for(i=1;i<=n;i++)if(dp[i]==res)pes=i;printf("%d\n-\n",res);for(i=1;i<=n;i++)ok[i]=0;ok[pes]=1;for(i=pes-1;i>=1;i--){if(dp[i]==res-1&&a[i]<a[pes]){pes=i;ok[pes]=1;res--;}}for(i=1;i<=n;i++)if(ok[i])printf("%d\n",a[i]);//return main();return 0;}


原创粉丝点击