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;
    }

    给我一个巨大的教训。

    好题哉!!!

  • 相关阅读:
    VC连接MySql
    Vc数据库编程基础MySql数据库的表查询功能
    Vc数据库编程基础MySql数据库的表增删改查数据
    【Anroid】9.1 ListView相关类及其适配器
    【Android】8.4 让主题自适应不同的Android版本
    【Android】8.3 自定义主题
    【Android】8.2 动态选择和设置主题
    【Android】8.1 主题基本用法
    【Android】7.8 MyDemos项目的结构和主界面相关代码
    【Android】7.7 以后改为在Win10下开发了
  • 原文地址:https://www.cnblogs.com/qing1/p/11185220.html
Copyright © 2011-2022 走看看