zoukankan      html  css  js  c++  java
  • AcWing 314. 低买 (线性DP)打卡

    题目:https://www.acwing.com/problem/content/316/

    题意:求一个最长单调递减子序列,然后并且求方案数,如果序列完全一样就不要了

    思路:我们肯定时修改LIS,我们在求得当前结尾得最长长度后,我们遍历前面是否有和当前数相等得数,如果有就把他的长度清零,避免重复方案数,然后我们再用一个数组记录以当前结尾得方案数有多少个

    #include<bits/stdc++.h>
    #define maxn  100005
    #define mod 1000000007
    using namespace std;
    typedef long long ll;
    ll f[maxn],g[maxn],a[maxn],n;
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++){
            cin>>a[i];
        }
        g[0]=1;
        for(int i=1;i<=n;i++){
            for(int j=0;j<i;j++){
                if(j==0||a[i]<a[j])
                    f[i]=max(f[i],f[j]+1);
            }
            for(int j=1;j<i;j++){
                if(a[j]==a[i]){
                    f[j]=0; 
                } 
            }
            for(int j=0;j<i;j++){
                if((!j||a[j]>a[i])&&f[i]==f[j]+1){
                    g[i]+=g[j];
                }
            }
        }
        ll mx=0; 
        for(int i=1;i<=n;i++){
            mx=max(mx,f[i]);
        }
        ll sum=0;
        for(int i=1;i<=n;i++){
            if(f[i]==mx){
                sum+=g[i];
            }
        }
        /*for(int i=1;i<=n;i++){
            cout<<g[i]<<" ";
        }
        cout<<"
    ";*/ 
        cout<<mx<<" "<<sum;
    }
  • 相关阅读:
    k8s令牌登录设置方法
    etcd查看集群信息
    go Map
    go 切片重组
    go For-range结构
    go 切片
    go 数组与切片
    go 内存优化
    go 格式化输出
    go 闭包函数
  • 原文地址:https://www.cnblogs.com/Lis-/p/11391792.html
Copyright © 2011-2022 走看看