zoukankan      html  css  js  c++  java
  • 嵊州普及Day4T4

    题意:求最长上升序列长度和方案数。

    思路:经典DP,不需什么别的东西,加一个数组储蓄程序数即可,原题300000可能N2会有问题,但问题不大。

    见代码:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    int n,type,q,a[100001],flag,b[100001],c[100001],sum;
    int main()
    {
        freopen("hamon.in","r",stdin);
        freopen("hamon.out","w",stdout);
        cin>>n>>type;
        for(int i=1;i<=n;i++)
        {
            c[i]=b[i]=1;
            cin>>a[i];
            q=0;
            for(int j=1;j<i;j++)
            {
                if(a[j]<a[i])
                {            
                    if(q!=0)    
                    if(b[j]==b[i]-1)
                    c[i]+=c[j];
                    if(b[j]>=b[i])
                    {
                        if(b[j]>b[i])
                        {
                            c[i]=c[j];
                            b[i]=b[j];
                        }
                        if(b[j]==b[i])
                        {
                            c[i]=c[j];
                            b[i]=b[j]+1;
                        }    
                        q=1;
                    }
                    
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            if(b[i]>b[flag])
            {
                flag=i;
            }  
        }
        cout<<b[flag]<<endl;
        if(type==1)
        {
            for(int i=1;i<=n;i++)
            if(b[i]==b[flag])
            sum+=c[i];
            cout<<sum%123456789;
        }
        return 0;
    }

    下面是悔恨时间。

    不开long long毁一生!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

    因为方案数很大,题中说要%123456789,一不小心没开long long

    好气啊!!!

    见代码*2:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    int n,type,q,a[100001],flag,b[100001];
    long long c[100001],sum;
    int main()
    {
        freopen("hamon.in","r",stdin);
        freopen("hamon.out","w",stdout);
        cin>>n>>type;
        for(int i=1;i<=n;i++)
        {
            c[i]=b[i]=1;
            cin>>a[i];
            q=0;
            for(int j=1;j<i;j++)
            {
                if(a[j]<a[i])
                {            
                    if(q!=0)    
                    if(b[j]==b[i]-1)
                    c[i]+=c[j];
                    if(b[j]>=b[i])
                    {
                        if(b[j]>b[i])
                        {
                            c[i]=c[j];
                            b[i]=b[j];
                        }
                        if(b[j]==b[i])
                        {
                            c[i]=c[j];
                            b[i]=b[j]+1;
                        }    
                        q=1;
                    }
                    
                }
            }
        }
        for(int i=1;i<=n;i++)
        {
            if(b[i]>b[flag])
            {
                flag=i;
            }  
        }
        cout<<b[flag]<<endl;
        if(type==1)
        {
            for(int i=1;i<=n;i++)
            if(b[i]==b[flag])
            sum+=c[i];
            cout<<sum%123456789;
        }
        return 0;
    }

    给我一个巨大的教训。

    好题哉!!!

  • 相关阅读:
    js中有关类、对象的增强函数
    ES6学习准备
    JavaScript中类型检测
    网页性能优化
    前端工程化
    2014年度总结和计划
    vim命令汇总
    互联网思维
    传统企业信息化
    创业这三年¥.NET之尴尬处境
  • 原文地址:https://www.cnblogs.com/qing1/p/11185220.html
Copyright © 2011-2022 走看看