daimayuan每日一题#849 国家铁路

 

 题目链接:国家铁路 - 题目 - Daimayuan Online Judgehttp://oj.daimayuan.top/course/11/problem/849

有亿点点难 

思路:直接枚举是on4,考虑枚举一个点,然后查找出另外一个点构成的最小值。                          namo,c*(|x1-x2|+|y1-y2|)这个式子在处理的时候就不能含有(x2,y2).我们考虑把绝对值拆开。

就会有两种情况: 一种是从左下到右上,一种是从左上到右下。                                                      用动态规划维护最小值即可

 

//#define pei_pei_


//#include<bits/stdc++.h>
#include<iostream>
#include<cmath>
#include<queue>
#include<vector>
#include<string>
#include<cstring>
#include<functional>
#include<iomanip>
#include<map>
#include<unordered_map>
#include<algorithm>
#include<set>
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define FI first
#define SE second
#define _for(type,i,a,b) for(type i=(a);i<(b);++i)
#define _efor(type,i,a,b) for(type i=(a);i<=(b);++i)
#define _rfor(type,i,a,b) for(type i=(a);i>(b);--i)
#define _refor(type,i,a,b) for(type i=(a);i>=(b);--i)
#define _sfor(p,st) for(auto &p:st)
#define endl '\n'
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
typedef pair<double,int> pdi;
const double pi=acos(-1.0);
const double eps=1e-8;
const int mod=100003;
const int _mod=998244353;
const ll inf=0x3f3f3f3f3f3f3f3f;
const int maxn=200010;
ull base=1331;
//-------------------------------------------------------------------
    ll maps[1005][1005];
    ll dpl[1005][1005];
    ll dpr[1005][1005];
//-------------------------------------------------------------------
signed main(){
    //ifstream cin("D:\\in.txt");
    //ofstream cout("D:\\out.txt");
    IOS;
    #ifdef pei_pei_
    double be=clock();
    #endif // err

//==================================================================
    ll h,w,c;
    cin>>h>>w>>c;
    _efor(ll,i,1,h)
    _efor(ll,j,1,w)
    cin>>maps[i][j];


    //第一
    _efor(ll,i,1,h)
    _efor(ll,j,1,w){
    dpl[i][j]=inf;
    }
    _refor(ll,i,h,1)
    _efor(ll,j,1,w){
        if(i+1<=h&&j-1>=1){
            dpl[i][j]=min(dpl[i+1][j],dpl[i][j-1]);
            dpl[i][j]=min(dpl[i][j],maps[i+1][j]+c*((i+1)-j));
            dpl[i][j]=min(dpl[i][j],maps[i][j-1]+c*(i-(j-1)));
        }
        else if(i+1<=h){
            dpl[i][j]=min(dpl[i+1][j],maps[i+1][j]+c*((i+1)-j));
        }
        else if(j-1>=1){
            dpl[i][j]=min(dpl[i][j-1],maps[i][j-1]+c*(i-(j-1)));
        }
    }



    //第二
    _efor(ll,i,1,h)
    _efor(ll,j,1,w){
        dpr[i][j]=inf;
    }
    _efor(ll,i,1,h)
    _efor(ll,j,1,w){
        if(i-1>=1&&j-1>=1){
            dpr[i][j]=min(dpr[i-1][j],dpr[i][j-1]);
            dpr[i][j]=min(dpr[i][j],maps[i-1][j]-c*((i-1)+j));
            dpr[i][j]=min(dpr[i][j],maps[i][j-1]-c*(i+(j-1)));
        }
        else if(i-1>=1){
            dpr[i][j]=min(dpr[i-1][j],maps[i-1][j]-c*((i-1)+j));
        }
        else if(j-1>=1){
            dpr[i][j]=min(dpr[i][j-1],maps[i][j-1]-c*(i+(j-1)));
        }
    }



    ll ans=inf;
    _efor(ll,i,1,h){
    _efor(ll,j,1,w){
        ans=min(ans,dpl[i][j]+maps[i][j]+c*(j-i));
    }
    }
    _efor(ll,i,1,h)
    _efor(ll,j,1,w){
        ans=min(ans,dpr[i][j]+maps[i][j]+c*(j+i));
    }
    cout<<ans<<'\n';
//==================================================================

    #ifdef pei_pei_
    double en=clock();
    cout<<endl<<"time: "<<fixed<<setprecision(8)<<en-be<<" ms";
    #endif // err
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值