【动态规划】【二分】【最长上升子序列】HDU 5773 The All-purpose Zero

来源:互联网 发布:上海市人口普查数据 编辑:程序博客网 时间:2024/05/21 13:46
题目链接:

  http://acm.hdu.edu.cn/showproblem.php?pid=5773

题目大意

  T组数据,n个数(n<=100000),求最长上升子序列长度(0可以替代任何自然数)

题目思路:

  【动态规划】【二分】【最长上升子序列】

  按最长上升子序列做,遇到0的时候更新所有长度的最优解。(这种暴力解法都能过?而且还比标解快?)


////by coolxxx//#include<iostream>#include<algorithm>#include<string>#include<iomanip>#include<memory.h>#include<time.h>#include<stdio.h>#include<stdlib.h>#include<string.h>//#include<stdbool.h>#include<math.h>#define min(a,b) ((a)<(b)?(a):(b))#define max(a,b) ((a)>(b)?(a):(b))#define abs(a) ((a)>0?(a):(-(a)))#define lowbit(a) (a&(-a))#define sqr(a) ((a)*(a))#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))#define eps (1e-8)#define J 10000000#define MAX 0x7f7f7f7f#define PI 3.1415926535897#define N 100004using namespace std;typedef long long LL;int cas,cass;int n,m,lll,ans;int a[N],q[N];void work(){int i,j,l,r,mid;lll=0;memset(q,-1,sizeof(q));for(i=1;i<=n;i++){if(a[i]==0){q[lll+1]=q[lll]+1;for(j=lll;j>1;j--)q[j]=min(q[j-1]+1,q[j]);q[1]=0;lll++;continue;}l=0,r=lll;while(l<r){mid=(l+r+1)>>1;if(a[i]>q[mid])l=mid;else r=mid-1;}q[r+1]=a[i];lll=max(lll,r+1);}}int main(){#ifndef ONLINE_JUDGEfreopen("1.txt","r",stdin);//freopen("2.txt","w",stdout);#endifint i,j;//for(scanf("%d",&cas);cas;cas--)for(scanf("%d",&cas),cass=1;cass<=cas;cass++)//while(~scanf("%s",s))//while(~scanf("%d",&n)){printf("Case #%d: ",cass);scanf("%d",&n);for(i=1;i<=n;i++){scanf("%d",&a[i]);}work();printf("%d\n",lll);}return 0;}/*////*/


   正解是把0先都拿出来,非0的数都减去它前面0的个数(0可以变成任何自然数),求最长上升子序列,再把0的数加上即为答案。


////by coolxxx////<bits/stdc++.h>#include<iostream>#include<algorithm>#include<string>#include<iomanip>#include<memory.h>#include<time.h>#include<stdio.h>#include<stdlib.h>#include<string.h>//#include<stdbool.h>#include<math.h>#define min(a,b) ((a)<(b)?(a):(b))#define max(a,b) ((a)>(b)?(a):(b))#define abs(a) ((a)>0?(a):(-(a)))#define lowbit(a) (a&(-a))#define sqr(a) ((a)*(a))#define swap(a,b) ((a)^=(b),(b)^=(a),(a)^=(b))#define mem(a,b) memset(a,b,sizeof(a))#define eps (1e-8)#define J 10000000#define MAX 0x7f7f7f7f#define PI 3.14159265358979323#define N 100004using namespace std;typedef long long LL;int cas,cass;int n,m,lll,ans;int a[N],q[N];void work(){int i,j,l,r,mid;lll=0;memset(q,-1,sizeof(q));for(i=1;i<=n;i++){l=0,r=lll;while(l<r){mid=(l+r+1)>>1;if(a[i]>q[mid])l=mid;else r=mid-1;}q[r+1]=a[i];lll=max(lll,r+1);}}int main(){#ifndef ONLINE_JUDGEfreopen("1.txt","r",stdin);//freopen("2.txt","w",stdout);#endifint i,j;//for(scanf("%d",&cas);cas;cas--)for(scanf("%d",&cas),cass=1;cass<=cas;cass++)//while(~scanf("%s",s))//while(~scanf("%d",&n)){printf("Case #%d: ",cass);scanf("%d",&n);m=0;for(i=1;i<=n;i++){scanf("%d",&a[i]);if(a[i]==0)n--,i--,m++;else a[i]-=m;}work();printf("%d\n",lll+m);}return 0;}/*////*/


0 0
原创粉丝点击