zoukankan      html  css  js  c++  java
  • 题解 POJ1952 【BUY LOW, BUY LOWER】

    题目链接:Link

    Problem

    Solution

    序列长度显然可以很简单地求出,至于个数,在不考虑重复的情况下,若更优则覆盖,相同则累加。
    考虑重复的情况,设i<=j,a[i]=a[j],显然在计算j的时,不能从i之前转移,且对序列长度无贡献,因此可用tag来维护一下,倒序枚举决策即可。

    Code

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int maxn=5005;
    int n,rlen,rtot,a[maxn],len[maxn],tot[maxn],useful[maxn];
    int main()
    {
    	#ifdef local
    	freopen("pro.in","r",stdin);
    	#endif
    	while(scanf("%d",&n)==1)
    	{
    		for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    		for(int i=1;i<=n;i++) len[i]=tot[i]=useful[i]=1;
    		rlen=rtot=0;
    		for(int i=1;i<=n;i++)
    		{
    			for(int j=i-1;j>=1;j--)
    			{
    				if(a[j]>a[i]&&useful[j])
    				{
    					if(len[i]==len[j]+1) tot[i]+=tot[j];
    					else if(len[i]<len[j]+1)
    					{
    						tot[i]=tot[j];
    						len[i]=len[j]+1;
    					}
    				}
    				else if(a[i]==a[j]) { if(len[i]==1) useful[i]=0; break; }
    			}
    			rlen=max(rlen,len[i]);
    		}
    		for(int i=1;i<=n;i++) if(len[i]==rlen) rtot+=tot[i];
    		printf("%d %d
    ",rlen,rtot);
    	}
    	return 0;
    }
    
  • 相关阅读:
    代码面试最常用的10大算法
    ant google compiler 压缩
    美工资源
    面试题
    validate表单验证插件
    laypage分页
    layer弹出框小结
    Thymeleaf
    webApp开发
    grunt自动化构建工具
  • 原文地址:https://www.cnblogs.com/happyZYM/p/11494521.html
Copyright © 2011-2022 走看看