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;
}

原文地址:https://www.cnblogs.com/DeepJay/p/12025210.html