zoukankan      html  css  js  c++  java
  • 1221D

    转化:考虑到相邻不相等,dp具有后效性,可以等效为当前高度与前一个不相等,这样就能递推了;

    以下转载自 https://www.cnblogs.com/F-Mu/p/11561159.html

    题意:对于n个栅栏,对于每个i,有高度a[i],对于任意2<=i<=n,有a[i]!=a[i−1],则称该组栅栏为好栅栏,每个栅栏可花费b[i]提升1个高度(可无限提升)。给一组栅栏,问最少花费多少可以将这组栅栏变为好栅栏。

    分析:对于第i个栅栏,他要保证不与第i−1和i+1个栅栏相同,最多提升2,如果提升2与第i−1或i+1相同,则可选择提升0或1,同理如果此时与另一侧栅栏相同,则可提升0或1使该栅栏与两侧栅栏不同。题意给出其实提醒了DP(说a[i]!=a[i−1])。我们设置DP[i][j]表示对于第i个栅栏,提升j后,使得前i个栅栏为好栅栏,0<=j<=2。

    (1)对于a[i]==a[i−1]的情况
    如果第i个栅栏提升0,则第i−1个栅栏需提升1或者2,那么有
    dp[i][0]=min(dp[i−1][1],dp[i−1][2]
    如果第i个栅栏提升1,则第i−1个栅栏需提升0或者2,那么有
    dp[i][1]=min(dp[i−1][0],dp[i−1][2])+b[i]
    如果第i个栅栏提升2,则第i−1个栅栏需提升0或者1,那么有
    dp[i][2]=min(dp[i−1][0],dp[i−1][1])+b[i]∗2

    (2)对于a[i]==a[i−1]+1的情况
    如果第i个栅栏提升0,则第i−1个栅栏需提升0或者2,那么有
    dp[i][0]=min(dp[i−1][0],dp[i−1][2])
    如果第i个栅栏提升1,则第i−1个栅栏需提升0或者1,那么有
    dp[i][1]=min(dp[i−1][0],dp[i−1][1])+b[i]
    如果第i个栅栏提升2,则第i−1个栅栏需提升0或者1或者2,那么有
    dp[i][2]=min(dp[i−1][0],min(dp[i−1][1],dp[i−1][2]))+b[i]∗2

    (3)对于a[i]==a[i−1]+2的情况
    如果第i个栅栏提升0,则第i−1个栅栏需提升0或者1,那么有
    dp[i][0]=min(dp[i−1][0],dp[i−1][1])
    如果第i个栅栏提升1,则第i−1个栅栏需提升0或者1或者2,那么有
    dp[i][1]=min(dp[i−1][0],min(dp[i−1][1],dp[i−1][2]))+b[i]
    如果第i个栅栏提升2,则第i−1个栅栏需提升0或者1或者2,那么有
    dp[i][2]=min(dp[i−1][0],min(dp[i−1][1],dp[i−1][2]))+b[i]∗2

    (4)对于a[i]==a[i−1]−1的情况
    如果第i个栅栏提升0,则第i−1个栅栏需提升0或者1或者2,那么有
    dp[i][0]=min(dp[i−1][0],min(dp[i−1][1],dp[i−1][2]))
    如果第i个栅栏提升1,则第i−1个栅栏需提升1或者2,那么有
    dp[i][1]=min(dp[i−1][1],dp[i−1][2])+b[i]
    如果第i个栅栏提升2,则第i−1个栅栏需提升0或者2,那么有
    dp[i][2]=min(dp[i−1][0],dp[i−1][2])+b[i]∗2

    (5)对于a[i]==a[i−1]−2的情况
    如果第i个栅栏提升0,则第i−1个栅栏需提升0或者1或者2,那么有
    dp[i][0]=min(dp[i−1][0],min(dp[i−1][1],dp[i−1][2]))
    如果第i个栅栏提升1,则第i−1个栅栏需提升0或者1或者2,那么有
    dp[i][1]=min(dp[i−1][0],min(dp[i−1][1],dp[i−1][2]))+b[i]
    如果第i个栅栏提升2,则第i−1个栅栏需提升1或者2,那么有
    dp[i][2]=min(dp[i−1][1],dp[i−1][2])+b[i]∗2

    (6)其他情况
    第i个栅栏提升0,1,2,第i−1个栅栏可提升0或者1或者2,有
    dp[i][0]=min(dp[i−1][0],min(dp[i−1][1],dp[i−1][2]))
    dp[i][1]=min(dp[i−1][0],min(dp[i−1][1],dp[i−1][2]))+b[i]
    dp[i][2]=min(dp[i−1][0],min(dp[i−1][1],dp[i−1][2]))+b[i]∗2

    最后输出min(dp[n][0],min(dp[n][1],dp[n][2]))即可

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const int N=3e5+5;
    const int inf=0x3f3f3f3f;
    const double eps=1e-6;
    LL read()
    {
        LL x=0,t=1;
        char ch=getchar();
        while(!isdigit(ch)){ if(ch=='-')t=-1; ch=getchar(); }
        while(isdigit(ch)){ x=x*10+ch-'0'; ch=getchar(); }
        return x*t;
    }
    LL a[N],b[N],f[N][3];
    int main()
    {
        int T=read();
        while(T--)
        {
            int n=read();
            for(int i=1;i<=n;i++)
            {
                a[i]=read();
                b[i]=read();
            }
            f[1][0]=0; f[1][1]=b[1]; f[1][2]=2*b[1];
            for(int i=2;i<=n;i++)
            {
                if(a[i]==a[i-1])
                {
                    f[i][0]=min(f[i-1][1],f[i-1][2] );
                    f[i][1]=min(f[i-1][0],f[i-1][2] )+b[i];
                    f[i][2]=min(f[i-1][0],f[i-1][1] )+2*b[i];
                }
                else if(a[i]-a[i-1]==1)
                {
                    f[i][0]=min(f[i-1][0],f[i-1][2] );
                    f[i][1]=min(f[i-1][0],f[i-1][1] )+b[i];
                    f[i][2]=min(f[i-1][0],min(f[i-1][1],f[i-1][2] ) )+2*b[i];
                }
                else if(a[i]-a[i-1]==-1)
                {
                    f[i][0]=min(f[i-1][0],min(f[i-1][1],f[i-1][2] ) );
                    f[i][1]=min(f[i-1][1],f[i-1][2] )+b[i];
                    f[i][2]=min(f[i-1][0],f[i-1][2] )+2*b[i];
                }
                else if(a[i]-a[i-1]==2)
                {
                    f[i][0]=min(f[i-1][0],f[i-1][1] );
                    f[i][1]=min(f[i-1][0],min(f[i-1][1],f[i-1][2] ) )+b[i];
                    f[i][2]=min(f[i-1][0],min(f[i-1][1],f[i-1][2] ) )+2*b[i];
                }
                else if(a[i]-a[i-1]==-2)
                {
                    f[i][0]=min(f[i-1][0],min(f[i-1][1],f[i-1][2] ) );
                    f[i][1]=min(f[i-1][0],min(f[i-1][1],f[i-1][2] ) )+b[i];
                    f[i][2]=min(f[i-1][1],f[i-1][2] )+2*b[i];
                }
                else
                {
                    f[i][0]=min(f[i-1][0],min(f[i-1][1],f[i-1][2] ) );
                    f[i][1]=min(f[i-1][0],min(f[i-1][1],f[i-1][2] ) )+b[i];
                    f[i][2]=min(f[i-1][0],min(f[i-1][1],f[i-1][2] ) )+2*b[i];
                }
            }
            printf("%lld
    ",min(f[n][0],min(f[n][1],f[n][2] ) ) );
        }
        return 0;
    }
    
    
  • 相关阅读:
    Elasticsearch部分节点不能发现集群(脑裂)问题处理
    最新阿里云服务器免费SSL证书配置HTTPS的两种方法(图文教程二)
    最新阿里云申请免费SSL证书实现网站HTTPS化(图文教程一)
    小程序开发-Now you can provide attr "wx:key" for a "wx:for" to improve performance
    Vue登录注册
    vue的成绩判断
    React路由简单介绍
    TodoList增删改查
    React组件简单介绍
    es6 Class类的使用
  • 原文地址:https://www.cnblogs.com/DeepJay/p/12025210.html
Copyright © 2011-2022 走看看