codeforces ant man 366 div1b

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34271269/article/details/52573152
#include <iostream>
#include <algorithm>
using namespace std;
#define maxn 5000+5
int a[maxn],b[maxn],c[maxn],d[maxn],x[maxn];
bool valid[maxn][maxn];
long long dp[maxn][maxn];
int n,s,e;
void update(long long &x,long long y,bool &z)
{
    if(!z) {z=1;x=y;return;}
    x=min(x,y);
}
int main()
{
    cin>>n>>s>>e;
    for(int i=1;i<=n;i++) cin>>x[i];
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=1;i<=n;i++) cin>>b[i];
    for(int i=1;i<=n;i++) cin>>c[i];
    for(int i=1;i<=n;i++) cin>>d[i];
    valid[0][0]=1;
    int mark=0;
    for(int i=1;i<=n;i++)
    {
        if(i==min(s,e)) mark=s<e?1:-1;
        else if(i==max(s,e)) mark=0;
        if(i!=s&&i!=e)
        {
            for(int j=0;j<=i&&j<=n-i;j++)
            {
                if(j&&valid[i-1][j-1])
                    update(dp[i][j],dp[i-1][j-1]+d[i]+b[i]-2*x[i],valid[i][j]);
                if((j||i==n)&&valid[i-1][j+1])
                    update(dp[i][j],dp[i-1][j+1]+a[i]+c[i]+2*x[i],valid[i][j]);
                if(j&&valid[i-1][j])
                {
                    if(j>1||!mark)
                        update(dp[i][j],dp[i-1][j]+min(a[i]+d[i],b[i]+c[i]),valid[i][j]);
                    else if(mark==1)
                        update(dp[i][j],dp[i-1][j]+a[i]+d[i],valid[i][j]);
                    else
                        update(dp[i][j],dp[i-1][j]+b[i]+c[i],valid[i][j]);
                }
            }
        }
        else if(i==s)
        {
            for(int j=0;j<=i&&j<=n-i;j++)
            {
               if(s<e&&j&&valid[i-1][j-1])
                   update(dp[i][j],dp[i-1][j-1]+d[i]-x[i],valid[i][j]);
               if(s<e&&j&&valid[i-1][j])
                   update(dp[i][j],dp[i-1][j]+c[i]+x[i],valid[i][j]);
                if(e<s&&(j||i==n)&&valid[i-1][j+1])
                    update(dp[i][j],dp[i-1][j+1]+c[i]+x[i],valid[i][j]);
                if(e<s&&valid[i-1][j]&&j)
                    update(dp[i][j],dp[i-1][j]+d[i]-x[i],valid[i][j]);
            }
        }
        else
        {
            for(int j=0;j<=i&&j<=n-i;j++)
            {
                if(s<e&&valid[i-1][j+1]&&(j||i==n))
                    update(dp[i][j],dp[i-1][j+1]+a[i]+x[i],valid[i][j]);
                if(s<e&&valid[i-1][j]&&j)
                    update(dp[i][j],dp[i-1][j]+b[i]-x[i],valid[i][j]);
                if(e<s&&valid[i-1][j]&&j)
                    update(dp[i][j],dp[i-1][j]+a[i]+x[i],valid[i][j]);
                if(e<s&&valid[i-1][j-1]&&j)
                    update(dp[i][j],dp[i-1][j-1]+b[i]-x[i],valid[i][j]);
            }
        }
    }
    printf("%lld",dp[n][0]);
    return 0;
}

看了femsub大牛的blog 终于会写了 终于把状态之间的转移过程想明白了 这个dp真的是6666666  需要注意的细节太多太多了

有机会再把自己的想法补上吧

猜你喜欢

转载自blog.csdn.net/qq_34271269/article/details/52573152
man