zoukankan      html  css  js  c++  java
  • CF957D Riverside Curio

    dp+预处理

    dp[i]表示第i天时的水位线有多少条,

    然后你会发现这个dp是有后效性的,当第i天的m[i]>dp[i-1]时就要修改之前的dp值

    因此我们预处理出每一天的至少要多少条水位线,记l[i]为多少条水位线

    所以每天至少需要m[i]+1条水位线,然后我们从后往前枚举,记录now表示从后推出当前的i需要的水位线

    l[i]=max(now,m[i]+1)

    #include <bits/stdc++.h>
    #define ll long long 
    using namespace std;
    ll n,m[100011],dp[100011];
    ll l[100011];
    int main()
    {
        scanf("%lld",&n);
        for (int i=1;i<=n;i++)
          scanf("%lld",&m[i]);
        ll now;
        now=m[n]+1;
        for (int i=n;i>=1;i--)
        {
            now--;
            now=max(now,m[i]+1);
            l[i]=now;//同上
        }
        dp[1]=1;//第一天肯定有一条水位线
        for (int i=2;i<=n;i++)
        {
            dp[i]=dp[i-1];
            dp[i]=max(dp[i],m[i]+1);
            dp[i]=max(dp[i],l[i]);
        }
        ll ans=0;
        for (int i=1;i<=n;i++)
          ans+=dp[i]-1-m[i];//统计水位之下的水位线
        printf("%lld
    ",ans);
    }
  • 相关阅读:
    SpringBoot笔记
    SpringBoot面试篇
    多线程篇
    Tomcat篇
    Redis篇
    Nginx篇
    JVM篇
    MySQL篇
    python ETL工具 pyetl
    python通用数据库操作工具 pydbclib
  • 原文地址:https://www.cnblogs.com/huangchenyan/p/11179328.html
Copyright © 2011-2022 走看看