• 动态规划训练之二十


    https://www.luogu.org/problem/P1370

    题目大意:Σ(1<=l<=r<=n)F(l, r),其中F(l,r)表示[l,r]之间的本质不同的子序列有多少个

    分析:

    如果本题数据是N2的话我就会做,但是要求是O(n)求出

    同样的区间计数题固定端点L,再考虑dp

    设dp[i]表示F[i,i]+F[i,i+1]+F[i,i+2]+....+F[i,n]

    如果没有重复的数字话

    dp[i]=(dp[i+1]<<1)+2

    意思是:

    dp[i+1]= F[i+1,i+1]+F[i+1,i+2]+F[i+1,i+3]+....+F[i+1,n]

    dp[i]= F[i,i]+ F[i,i+1]+ F[i,i+2]+ F[i,i+3] +....+ F[i,n]

    相信一看就懂把

    但是有重复怎么办?

    若ai==aj(i<j)

    则dp[i]-=dp[j+1]+1;

    原因是 后面所有的F[j+1,j+1].....都会有一次重复(接ai,接aj)

    那个1就是F[j,j]中选j或不选j中的选j的方案

    code(代码懒得打了):

    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define mod 998244353
    #ifdef ONLINE_JUDGE
    char *TT,*mo,but[(1<<15)+2];
    #define getchar() ((TT==mo&&(mo=(TT=but)+fread(but,1,1<<15,stdin)),TT==mo)?0:*TT++)
    #endif
    inline int read(){
        int x=0,c=0,f=1;
        for(;c<'0'||c>'9';c=getchar())f=c!='-';
        for(;c>='0'&&c<='9';c=getchar())x=x*10+c-'0';
        return f?x:-x;
    }
    int head[100010];
    int a[100010],b[100010];
    ll dp[100010];
    ll ans;
    int n;
    int main(){
        n=read();
        for(int i=1;i<=n;i++){
            a[i]=read();
            b[i]=a[i];
        } 
        sort(b+1,b+n+1);
        int cnt=unique(b+1,b+n+1)-b-1;
        for(int i=1;i<=n;i++)a[i]=lower_bound(b+1,b+cnt+1,a[i])-b;
        dp[n]=2;
        head[a[n]]=n;
        for(int i=n-1;i>0;i--){
            dp[i]=(dp[i+1]*2+2)%mod;
            if(head[a[i]]){
                dp[i]=(dp[i]-dp[head[a[i]]+1]+mod-1)%mod;
                head[a[i]]=i;
            }
            head[a[i]]=i;
        }
        for(int i=1;i<=n;i++){
            ans=(ans+dp[i])%mod;
        }
        cout<<ans;
        return 0;
    }
    
  • 相关阅读:
    P3387 【模板】缩点 tarjan
    P2831 愤怒的小鸟 状压dp
    交流帖
    P3959 宝藏 模拟退火。。。
    B1060 [ZJOI2007]时态同步 dfs
    P1850 换教室 概率dp
    树链刨分(待修改)
    B3403 [Usaco2009 Open]Cow Line 直线上的牛 deque
    B3402 [Usaco2009 Open]Hide and Seek 捉迷藏 最短路
    B5248 [2018多省省队联测]一双木棋 状压dp
  • 原文地址:https://www.cnblogs.com/wzxbeliever/p/11808252.html
Copyright © 2020-2023  润新知