题目链接:国家铁路 - 题目 - 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;
}