zoukankan      html  css  js  c++  java
  • $Noip2013/Luogu1970$ 花匠 $dp$+思维

    $Luogu$

    $Sol$

    $Poj1037 A Decorative Fence$好像吖.

    $f[i][0/1]$表示前$i$个数,且选了第$i$个数,这个数相对于上一个数是下降(上升)的,这样的序列的最大长度.

    $f[i][0]=max(f[k][1])+1,k<i且h[k]>h[i]$

    $f[i][1]=max(f[k][0])+1,k<i且h[k]>h[i]$

    最后答案就是$max_{i=1}^{n}f[i][0/1]$.

    然而这样的复杂度是$O(N^2/2)$的,不能$AC$,优化很容易想到能不能去掉内层循环,通过某个变量维护或者是$f[i][0/1]$直接由$f[i-1][0/1]$推出.前者似乎是不可行的,考虑后者.将$f[i][0]$的意思改成前$i$个数选了若干数,最后一个数相对于倒数第二个数是递减的序列的最长长度,$f[i][1]$类似.然而我根本就想不到转移方程于是打开$TJ....ovo$

    $if(h[i]>h[i-1])f[i][1]=f[i-1][0]+1;else f[i][1]=f[i-1][1];$

    $if(h[i]<h[i-1])f[i][0]=f[i-1][1]+1;else f[i][0]=f[i-1][0];$

    最后答案是$f[n][0/1].$

    这样理解叭,对于当前序列,假如最后一个数是波谷,那么我们是希望这个数越小越好的,因为后面的波峰更有选择余地.

     $upd on 10.27:$发现我还是不会这题所以又回来看$TJ$,发现不是特别懂上面的$dp$做法,觉得正确性可能还是有点难理解,所以换了一种贪心做法,具体过程写在这里了,点目录里的$2013$可以快速跳转.

    $Code$

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<queue>
    #include<algorithm>
    #define il inline
    #define Rg register
    #define go(i,a,b) for(Rg int i=a;i<=b;++i)
    #define yes(i,a,b) for(Rg int i=a;i>=b;--i)
    #define mem(a,b) memset(a,b,sizeof(a))
    #define ll long long
    #define db double
    #define inf 2147483647
    using namespace std;
    il int read()
    {
        Rg int x=0,y=1;char c=getchar();
        while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
        while(c>='0'&&c<='9'){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
        return x*y;
    }
    const int N=100010;
    int n,h[N];
    ll f[N][2];
    il ll Max(ll x,ll y){return x>y?x:y;}
    int main()
    {
        n=read();go(i,1,n)h[i]=read();
        f[1][0]=f[1][1]=1;
        go(i,2,n)
        {
            if(h[i]>h[i-1])f[i][1]=f[i-1][0]+1;
            else f[i][1]=f[i-1][1];
            if(h[i]<h[i-1])f[i][0]=f[i-1][1]+1;
            else f[i][0]=f[i-1][0];
        }
        printf("%lld
    ",max(f[n][0],f[n][1]));
        return 0;
    }
    View Code
  • 相关阅读:
    近况说明
    【模板】Johnson 全源最短路
    富文本编辑器,webbrowser控件 document.execCommand() 解析
    Visual studio 2010 工具箱名称不显示的原因
    利用批处理bat实现 【QQ批量登陆】
    ESPCMS 使用上碰到的一些问题记录
    Java虚拟机的GC垃圾回收机制(garbage collection)
    垃圾回收机制及循环引用
    C++ 的强引用和弱引用
    (转载)Linux的file descriptor笔记
  • 原文地址:https://www.cnblogs.com/forward777/p/11410363.html
Copyright © 2011-2022 走看看