zoukankan      html  css  js  c++  java
  • hdu4512(最大公共上升子序列)

    这道题我之前做过一次,当时没想明白,wa了。今天再次看见,重新审视题目后,确定这就是一个最大上升子序列,当时还挺兴奋的,可后面发现我不知道该怎么去区分存不存在中间最高点的情况。思考了许久,还是没想明白,然后还是去查解题报告了。。。。。

    这个算法非常巧妙,用暴力去枚举所有有中间点和没有中间点的情况,然后取其中最大的。这算是什么?半DP半暴力?暴力与美学的结合?

    关于最大公共上升子序列的算法,我之前有一篇博客已经解释过了,也就不再解释了。

    链接:hdu 1423(最大公共上升子序列)

    #include<stdio.h>
    #include<string.h>
    #define N 205
    int a[N],b[N],ans[N];
    int Max(int x,int y)
    {
    	return x>y?x:y;
    }
    int LCIS(int x,int y)
    {
    	memset(ans,0,sizeof(ans));
    	int sum;
    	int i,j,k;
    	for(i=1;i<=x;i++)
    	{
    		k=0;
    		for(j=1;j<=y;j++)
    		{
    			if(b[j]<a[i]&&ans[k]<ans[j])
    				k=j;
    			if(b[j]==a[i])
    				ans[j]=ans[k]+1;
    		}
    	}
    	sum=0;
    	for(i=1;i<=y;i++)
    		sum=Max(sum,ans[i]);
    	return sum*2;
    }
    int main()
    {
    	int T;
    	scanf("%d",&T);
    	while(T--)
    	{
    		int n;
    		int i;
    		scanf("%d",&n);
    		for(i=1;i<=n;i++)
    		{
    			scanf("%d",&a[i]);
    			b[n-i+1]=a[i];
    		}
    		int ans;
    		ans=0;
    		for(i=1;i<=n;i++)
    		{
    			ans=Max(LCIS(i,n-i),ans);
    			ans=Max(LCIS(i,n-i+1)-1,ans);
    		}
    		printf("%d\n",ans);
    	}
    	return 0;
    }



  • 相关阅读:
    Java多线程(3) Volatile的实现原理
    Java 多线程(2)-Executor
    Java 多线程(1)-Thread和Runnable
    nginx+php部署
    MySQL的慢查询分析
    MySQL 错误
    log4j.properties配置详解
    Windows下Nginx的安装与配置(转)
    Java 字符的验证
    Spring MVC3返回JSON数据中文乱码问题解决(转)
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3098675.html
Copyright © 2011-2022 走看看